通过比较数据中的一对多列进行布尔切片

2024-04-23 14:38:33 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将一列与所有其他列进行比较,并通过使用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

但不幸的是,这个序列对所有行都是错误的。我怎样才能解决这个问题?你知道吗


Tags: 数据importnumpyfalsedfasnp切片
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

假设您使用这个作为掩码,您可以简单地将另一个轴添加到底层ndarray以允许广播。根据数据帧的大小,这应该更快一些。你知道吗

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

相关问题 更多 >