在Pandas中使用循环的多列过滤函数

f45qwnt8  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(125)

假设我有以下Pandas dataframe:

df = DataFrame({'A' : [True, True, False], 'B' : [1, 1, 2], 'C' : [3, 4, 5]})

|        A |        B |        C |
| -------- | -------- | -------- |
| True     | 1        | 3        |
| True     | 1        | 4        |
| False    | 2        | 5        |

我想写一个函数,它将给予一个列的列表及其相应的值作为输入,它将返回过滤后的列表。比如说

def pandas_filter(df, columns_list, values_list):
    return df.loc[df[columns_list] == values_list]

继续这个例子,当我编写下面的代码时

result = pandas_filter(df=df, columns_list=[A, B], values_list=[True, 1])

我想得到以下结果

|        A |        B |        C |
| -------- | -------- | -------- |
| True     | 1        | 3        |
| True     | 1        | 4        |
def pandas_filter(df, columns_list, values_list):
    return df.loc[df[columns_list] == values_list]

此函数返回ValueError(“无法使用多维键进行索引”)

5sxhfpxr

5sxhfpxr1#

你只需要把你的 eq-comparison==)和all链接起来,形成一个 mask

def pandas_filter(df, columns_list, values_list):
    return df.loc[
        (df[columns_list] == values_list).all(axis=1) # <-- add it here
    ]

result = pandas_filter(df=df, columns_list=["A", "B"], values_list=[True, 1])

输出:

print(result)

      A  B  C
0  True  1  3
1  True  1  4
  • 中间体:*
>>> df[columns_list] == values_list
       A      B
0   True   True
1   True   True
2  False  False

>>> (df[columns_list] == values_list).all(axis=1)
0     True
1     True
2    False
dtype: bool
mqxuamgl

mqxuamgl2#

代码中有一个小错误,因为需要将columns_list中的列名指定为字符串。此外,==运算符不适用于值列表。您可以使用isin()方法,该方法允许您检查列是否包含其中一个值 在名单上。

def pandas_filter(df, columns_list, values_list):
    conditions = pd.Series(True, index=df.index)
    for col, val in zip(columns_list, values_list):
        conditions = conditions & df[col].isin([val])
    return df.loc[conditions]

isin()方法检查列中的每个值是否包含在相应的值列表中。

相关问题