Pandas多列过滤函数报错:无法使用多维键索引
解决Pandas多列过滤的报错问题
现有如下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 |
需要编写一个函数,接收列名列表和对应值列表作为输入,返回过滤后的DataFrame。例如调用result = pandas_filter(df=df, columns_list=['A', 'B'], values_list=[True, 1])时,应得到:
| A | B | C |
|---|---|---|
| True | 1 | 3 |
| True | 1 | 4 |
原函数执行时抛出ValueError("Cannot index with multidimensional key")错误:
def pandas_filter(df, columns_list, values_list): return df.loc[df[columns_list] == values_list]
错误原因
df[columns_list] == values_list会生成一个布尔类型的DataFrame(每行对应各列是否匹配对应值),而df.loc[]需要的是一维的布尔索引(每行整体是否符合条件),直接传入多维的布尔DataFrame就会触发这个错误。
正确实现方法
方法一:使用eq()+all(axis=1)
通过eq()方法批量匹配列与对应值,再用all(axis=1)将每行的所有匹配结果合并为一个布尔值(所有列都匹配才返回True):
def pandas_filter(df, columns_list, values_list): mask = df[columns_list].eq(values_list).all(axis=1) return df.loc[mask]
方法二:遍历列手动构建条件
逐个遍历列和对应值,逐步叠加逻辑与条件,最终生成一维布尔索引:
def pandas_filter(df, columns_list, values_list): mask = True for col, val in zip(columns_list, values_list): mask &= df[col] == val return df.loc[mask]
两种方式都能正确实现多列匹配过滤,返回预期结果。
内容的提问来源于stack exchange,提问作者Onur Tavaslıoğlu
相关产品推荐
相关产品推荐

