我有一个值数据框,
df1 = pd.DataFrame(np.random.rand(5*4).reshape(5,4),columns=['a','b','c','d'])
a b c d
0 0.346137 0.537688 0.984077 0.809581
1 0.644753 0.363966 0.617507 0.114848
2 0.495147 0.014281 0.780733 0.579303
3 0.393447 0.108278 0.255716 0.318466
4 0.718629 0.789863 0.217532 0.891606
和一系列最大值。
s = pd.Series(np.random.rand(4),index=['a','b','c','d'])
a 0.005678
b 0.419059
c 0.511721
d 0.322693
我正在尝试识别df1中df1列中的值大于s中对应值的所有行。
我有办法一次做一个这样的专栏,但是想一次完成。
df1[df1.a > s.a].index,df1[df1.b > s.b].index,df1[df1.c > s.c].index,df1[df1.d > s.d].index
(Int64Index([0, 1, 2, 3, 4], dtype='int64'),
Int64Index([0, 4], dtype='int64'),
Int64Index([0, 1, 2], dtype='int64'),
Int64Index([0, 2, 4], dtype='int64'))
最后,我希望结果为[0,1,2,3,4]
答案 0 :(得分:3)
这是一种方法 -
r,c = np.where((df1 > s).T)
out = np.split(df1.index[c], np.flatnonzero(r[1:] > r[:-1])+1 )
示例运行 -
In [141]: df1
Out[141]:
a b c d
0 0.346137 0.537688 0.984077 0.809581
1 0.644753 0.363966 0.617507 0.114848
2 0.495147 0.014281 0.780733 0.579303
3 0.393447 0.108278 0.255716 0.318466
4 0.718629 0.789863 0.217532 0.891606
In [142]: s
Out[142]:
a 0.005678
b 0.419059
c 0.511721
d 0.322693
dtype: float64
In [143]: r,c = np.where((df1 > s).T)
In [144]: np.split(df1.index[c], np.flatnonzero(r[1:] > r[:-1])+1 )
Out[144]:
[Int64Index([0, 1, 2, 3, 4], dtype='int64'),
Int64Index([0, 4], dtype='int64'),
Int64Index([0, 1, 2], dtype='int64'),
Int64Index([0, 2, 4], dtype='int64')]
答案 1 :(得分:1)
我找到了
df1.loc[(df1 > s).any(axis=1) == True].index.tolist()
正常工作,简洁明了。