来自元组列表的数据框列过滤器

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

【讨论】:

非常感谢威廉。这完全符合预期。

以上是关于来自元组列表的数据框列过滤器的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:考虑多种条件正确过滤数据框列

将过滤器列表应用于来自使用 pandas 的列表的数据框

根据另一列的值过滤数据框列[重复]

Pandas 通过子字符串匹配过滤数据框列

过滤熊猫数据框列中的字符串/浮点数/整数值

将 Pyspark 数据框转换为具有实际值的列表