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

EMT*_*EMT 4 python dataframe pandas

我有一个 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)
Run Code Online (Sandbox Code Playgroud)

输出如下:

     subA  subB  subC
   2    70    30    56
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

我期待看到这样的结果:

    subA  subB  subC
 1    54    25    43
Run Code Online (Sandbox Code Playgroud)

但相反,输出充满了 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
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么以获得所需的输出?我也试过 .loc 和 iloc 但这些都没有帮助。

Dis*_*ani 6

您可以使用all它来实现布尔索引

df[(df[my_sub] == my_marks).all(axis=1)]
   subA  subB  subC
0    54    25    43
Run Code Online (Sandbox Code Playgroud)

或者像@ansev 所说的那样使用eqandall

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