通过比较pandas中的一列到多列进行布尔切片

时间:2017-11-15 17:45:21

标签: python python-3.x pandas dataframe

如何将列与所有其他列进行比较并获取布尔序列以使用i loc对数据帧进行切片?

import numpy as np
import pandas as pd
a = np.random.normal(1,10,(10,1))
b = np.random.normal(1,5,(10,1))
c = np.random.normal(1,5,(10,1))
d = np.random.normal(1,5,(10,1))

e = np.append(a,b, axis = 1)
e = np.append(e,c, axis = 1)
e = np.append(e,d, axis = 1)

df = pd.DataFrame(data = e, columns=['a','b','c','d'])



          a         b          c          d
0   4.043832 -1.672865  -0.401864   3.073481
1   4.828796 -0.830688   3.652347  -1.780346
2  13.055145  5.730707  -2.305093  -4.566279
3   6.589498 -0.525029  -1.077942  -3.850963
4   5.273932 -1.003112   0.393002  -0.415573
5  -7.872004 -2.506250   1.725281   6.676886
6  -4.797119  6.448990   0.254142  -7.374601
7   8.610763  8.075350  13.043584  12.768633
8 -10.871154  2.152322   2.093089  11.570059
9 -22.148239  1.493870   3.649696   2.455621

df.loc[df.a > df.b]  

将给出所需的结果,但仅用于1:1比较

        a         b          c          d
0   4.043832 -1.672865  -0.401864   3.073481
1   4.828796 -0.830688   3.652347  -1.780346
2  13.055145  5.730707  -2.305093  -4.566279
3   6.589498 -0.525029  -1.077942  -3.850963
4   5.273932 -1.003112   0.393002  -0.415573
7   8.610763  8.075350  13.043584  12.768633

我的方法是这样的:

S = ['b','c','d']

(df.a > df[S]).any(axis = 1)

0    False
1    False
2    False
3    False
4    False
5    False
6    False
7    False
8    False
9    False
dtype: bool

但不幸的是,这个系列在所有行中都是假的。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用lt

df[S].lt(df.a,0).any(axis=1)
Out[808]: 
0    False
1     True
2     True
3     True
4     True
5     True
6     True
7    False
8     True
9     True
dtype: bool

答案 1 :(得分:1)

鉴于你正在使用它作为掩码,你可以简单地将另一个轴添加到底层的ndarray以允许广播。这应该稍快一些,具体取决于您的DataFrame的大小。

(df[S].values < df.a.values[:,None]).any(1)