通过比较熊猫中的多个列来选择数据框

时间:2020-08-26 08:44:46

标签: python pandas dataframe

我有一个pandas数据框,想要选择某些列具有某些特定值的行。例如,对于一列,我尝试过这样:

df = pd.DataFrame({
    'subA': [54,98,70,91,38],
    'subB': [25,26,30,93,30],
    'subC': [43,89,56,50,48]})


a = df[df['subA'] == 70]
print(a)

输出如下:

     subA  subB  subC
   2    70    30    56

这是预料之中的,完全可以理解。现在,我想选择前两列具有特定值的行。例如,我将代码更改如下:

df = pd.DataFrame({
    'subA': [54,98,70,91,38],
    'subB': [25,26,30,93,30],
    'subC': [43,89,56,50,48]})

my_sub = ['subA', 'subB']
my_marks = [54, 25]


a = df[df[my_sub] == my_marks]
print(a)

我原本希望看到这样的结果:

    subA  subB  subC
 1    54    25    43

但是相反,输出充满了NaN值,这对我来说并不明确:

     subA  subB  subC
0  54.0  25.0   NaN
1   NaN   NaN   NaN
2   NaN   NaN   NaN
3   NaN   NaN   NaN
4   NaN   NaN   NaN

我在这里缺少想要的输出吗?我也尝试过.loc和iloc,但是没有帮助。

2 个答案:

答案 0 :(得分:6)

您可以使用all使布尔索引成为可能

df[(df[my_sub] == my_marks).all(axis=1)]
   subA  subB  subC
0    54    25    43

或者使用@anev说的eqall

df[df[my_sub].eq(my_marks).all(axis=1)]
   subA  subB  subC
0    54    25    43

答案 1 :(得分:3)

尝试:

df.loc[df.filter(my_sub).isin(my_marks).all(1)]

第一步是仅选择感兴趣的列,使用isin函数获取布尔值。 all函数仅获取完全为True的行,然后您可以为原始数据帧建立索引以获取结果

       subA subB    subC
   0    54   25      43