如何通过多列集过滤熊猫数据框?

时间:2020-04-16 06:24:17

标签: python pandas dataframe

有没有一种方法可以通过将多个列与一组元组进行比较来过滤大型数据帧,其中元组中的每个元素对应于一个不同的列值? 例如,是否有一种.isin()方法将DataFrame的多个列与一组元组进行比较?

示例:

df = pd.DataFrame({
    'a': [1, 1, 1],
    'b': [2, 2, 0],
    'c': [3, 3, 3],
    'd': ['not', 'relevant', 'column'],
})

# Filter the DataFrame by checking if the values in columns [a, b, c] match any tuple in value_set
value_set = set([(1,2,3), (1, 1, 1)])

new_df = ??  # should contain just the first two rows of df

1 个答案:

答案 0 :(得分:4)

您可以使用Series.isin,但必须首先通过前三列创建元组:

print (df[df[['a','b','c']].apply(tuple, axis=1).isin(value_set)])

或将列转换为索引并使用Index.isin

print (df[df.set_index(['a','b','c']).index.isin(value_set)])

   a  b  c         d
0  1  2  3       not
1  1  2  3  relevant

另一个想法是使用助手DataFrame的{​​{3}}的内部联接,并使用相同的3列名称,然后应省略on参数,因为通过两个df的列名称的交集联接:

print (df.merge(pd.DataFrame(value_set, columns=['a','b','c'])))
   a  b  c         d
0  1  2  3       not
1  1  2  3  relevant