我需要将数据框中的某些列作为一个整体进行比较,例如: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 中解决:比较 Series 中的列表对象虽然一般我已经解决了我的情况,但我仍然想知道是否有更简单的方法来解决这个问题?谢谢。
2 回答
智慧大石
TA贡献1946条经验 获得超3个赞
您可以通过数据的 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 级循环。
慕后森
TA贡献1802条经验 获得超5个赞
或[[]]用于获取多列:
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
>>>
添加回答
举报
0/150
提交
取消
