Python 熊猫:如何用列表/元组比较多个单元格

Python 熊猫:如何用列表/元组比较多个单元格,python,pandas,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'] 然而,实际上,我的dataframe有几十列,这些列应该作为一

我需要将数据帧中的一些列作为一个整体进行比较,例如:

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']
然而,实际上,我的dataframe有几十列,这些列应该作为一个整体进行比较。如果我选择列出所有问题,上述解决方案将非常混乱。所以我认为如果把它们作为一个整体来比较,可以解决这个问题:

#something just like this:
df.loc[df.loc[:,'A':'B']==[1,4],'A':'B')]
没用。所以我想到了一个想法,首先将所有需要的列合并成一个新列作为列表值,然后将这个新列与列表进行比较。后者已在2007年得到解决


虽然一般来说我已经解决了我的问题,但我还是想知道是否有更简单的方法来解决这个问题?谢谢。

您可以通过数据的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级别的循环。

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

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


能否请您更具体地说明“Numpy数组表示法”?你是指方程df.loc[:,'A':'B'].值==[1,4]?当然,所以从数据帧返回一个NumPy数组。我明白了,这是否意味着熊猫以NumPy数组的形式存储数值数据?这很有趣,我还没有意识到熊猫和熊猫之间有这样的关系Numpy@ShiangHoo是的,整个熊猫框架是建立在NumPy之上的。
>>> 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
>>>