来自元组列表的数据框列过滤器
Posted
技术标签:
【中文标题】来自元组列表的数据框列过滤器【英文标题】:Dataframe column filter from a list of tuples 【发布时间】:2020-04-16 17:17:00 【问题描述】:我正在尝试创建一个函数来从元组列表中过滤数据框。我已经创建了以下函数,但它似乎没有工作。 元组列表将具有数据框列名称,以及要过滤的最小值和最大值。
例如:
eg_tuple = [('colname1', 10, 20), ('colname2', 30, 40), ('colname3', 50, 60)]
我尝试的功能如下:
def col_cut(df, cutoffs):
for c in cutoffs:
df_filter = df[ (df[c[0]] >= c[1]) & (df[c[0]] <= c[2])]
return df_filter
请注意,该函数不应过滤值等于最大值或最小值的行。感谢您的帮助。
【问题讨论】:
【参考方案1】:将list comprehension
创建的所有掩码中的np.logical_and + reduce 与Series.between
一起使用:
def col_cut(df, cutoffs):
mask = np.logical_and.reduce([df[col].between(min1,max1) for col,min1,max1 in cutoffs])
return df[mask]
【讨论】:
【参考方案2】:问题是您每次都以df
作为过滤源。你应该过滤:
def col_cut(df, cutoffs):
df_filter = df
for col, mn, mx in cutoffs:
dfcol = df_filter[col]
df_filter = df_filter[(dfcol >= mn) & (dfcol <= mx)]
return df_filter
请注意,您可以在此处使用.between(..)
[pandas-doc]:
def col_cut(df, cutoffs):
df_filter = df
for col, mn, mx in cutoffs:
df_filter = df_filter[df_filter[col].between(mn, mx)]
return df_filter
【讨论】:
非常感谢威廉。这完全符合预期。以上是关于来自元组列表的数据框列过滤器的主要内容,如果未能解决你的问题,请参考以下文章