熊猫:如何将多个单元格与列表/元组进行比较

时间:2018-11-02 09:09:51

标签: python pandas

我需要比较整个数据框中的某些列,例如:

df = pd.DataFrame({'A':[1,1,3],'B':[4,5,6]})

#Select condition: If df['A'] == 1 and df['B'] == 4, then pick up this row. 

对于这个简单的示例,我可以使用以下方法:

df.loc[(df['A']==1)&(df['B']==4),'A':'B']

但是,实际上我的数据框有数十列,应该整体比较。如果我选择列出所有这些,上述解决方案将非常混乱。因此,我认为,如果将它们作为一个整体与列表进行比较可能会解决问题:

#something just like this:
df.loc[df.loc[:,'A':'B']==[1,4],'A':'B')]

不起作用。因此,我想到了一个想法,首先将所有所需的列合并为一个新列,作为列表值,然后将该新列与列表进行比较。后者已在Pandas: compare list objects in Series

中解决

尽管通常情况下我已经解决了案件,但我仍然想知道是否有更简单的方法来解决此问题?谢谢。

2 个答案:

答案 0 :(得分:2)

您可以通过数据的NumPy数组表示形式使用布尔掩码:

df = pd.DataFrame({'A':[1,1,3],'B':[4,5,6]})

res = df[(df.loc[:, 'A':'B'].values == [1, 4]).all(1)]

print(res)

   A  B
0  1  4

在这种情况下,切勿将您的列合并到一个单独的列表列表中。这样效率低下,因为您将失去所有向量化的好处,此后的任何处理都将涉及Python级循环。

答案 1 :(得分:2)

或使用[[]]获取多列:

df[(df[['A','B']].values==[1,4]).all(1)]

演示:

>>> df = pd.DataFrame({'A':[1,1,3],'B':[4,5,6]})
>>> df[(df[['A','B']].values==[1,4]).all(1)]
   A  B
0  1  4
>>>