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

时间:2019-12-26 12:58:15

标签: pandas list dataframe filter tuples

我正在尝试创建一个函数来从元组列表中过滤数据帧。我创建了以下功能,但似乎无法正常工作。 元组列表将具有数据框列名称,以及要过滤的最小值和最大值。

例如:

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

请注意,该函数不应在值等于max或min的行上进行过滤。感谢帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

list comprehensionnp.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]