我需要比较整个数据框中的某些列,例如:
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
中解决尽管通常情况下我已经解决了案件,但我仍然想知道是否有更简单的方法来解决此问题?谢谢。
答案 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
>>>