Python 数据帧中最大的两行
如果这是我的数据帧:Python 数据帧中最大的两行,python,group-by,pandas,Python,Group By,Pandas,如果这是我的数据帧: rand = np.random.RandomState(1) df = pd.DataFrame({'A': ['comp1', 'comp2'] * 9, 'B': ['user1', 'user2','user3'] * 6, 'C': rand.randn(18)}) A B C 0 comp1 user1 1.624345 1 comp2 user2
rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['comp1', 'comp2'] * 9,
'B': ['user1', 'user2','user3'] * 6,
'C': rand.randn(18)})
A B C
0 comp1 user1 1.624345
1 comp2 user2 -0.611756
2 comp1 user3 -0.528172
3 comp2 user1 -1.072969
4 comp1 user2 0.865408
5 comp2 user3 -2.301539
6 comp1 user1 1.744812
7 comp2 user2 -0.761207
8 comp1 user3 0.319039
9 comp2 user1 -0.249370
10 comp1 user2 1.462108
11 comp2 user3 -2.060141
12 comp1 user1 -0.322417
13 comp2 user2 -0.384054
14 comp1 user3 1.133769
15 comp2 user1 -1.099891
16 comp1 user2 -0.172428
17 comp2 user3 -0.877858
我想运行pandas命令来返回相同形式的结果集,但是对于a和B的每个组合,只显示C的两个最大值
我知道我可以使用以下方法按A和B升序排序,然后按C降序排序:
df.sort_index(by = ['A','B','C'],ascending=[True,True,False])
然后我想我需要使用groupby来只显示C的两个最大值。我能得到的最接近的是通过使用first()和last()来显示最大值和最小值
问题是我想要的是最大的2(或者一般来说,最大的x),加上我想要的最终结果集的形式与我的原始数据帧相同
感谢您在这方面的帮助。如果我理解正确,您希望在数据框中添加另一列,只显示组中哪个
C
值最高?如果我是正确的,您可以使用groupby
,然后遍历每个组,按C
值排序,并使用排序组中最高2个值的索引将D
列的值设置为True
:
df['D'] = False
grouped = df.groupby(['A', 'B'])
for grouer, group in grouped:
df.ix[group.sort_index(by='C')[-2:].index, 'D'] = True
这将产生:
A B C D
0 comp1 user1 1.624345 True
1 comp2 user2 -0.611756 True
2 comp1 user3 -0.528172 False
3 comp2 user1 -1.072969 True
4 comp1 user2 0.865408 True
5 comp2 user3 -2.301539 False
6 comp1 user1 1.744812 True
7 comp2 user2 -0.761207 False
8 comp1 user3 0.319039 True
9 comp2 user1 -0.249370 True
10 comp1 user2 1.462108 True
11 comp2 user3 -2.060141 True
12 comp1 user1 -0.322417 False
另一方面,如果您只想将最高的C
值过滤到新的数据帧中,请执行以下操作:
indexes = []
grouped = df.groupby(['A', 'B'])
for grouer, group in grouped:
indexes.extend(group.sort_index(by='C')[-2:].index)
df.iloc[indexes, :]
这将筛选出每组中最高的两个,为您提供:
A B C
0 comp1 user1 1.624345
6 comp1 user1 1.744812
4 comp1 user2 0.865408
10 comp1 user2 1.462108
8 comp1 user3 0.319039
14 comp1 user3 1.133769
3 comp2 user1 -1.072969
9 comp2 user1 -0.249370
1 comp2 user2 -0.611756
13 comp2 user2 -0.384054
11 comp2 user3 -2.060141
17 comp2 user3 -0.877858
谢谢,维克多。是的,我在每组中都排在前两名之后。
A B C
0 comp1 user1 1.624345
6 comp1 user1 1.744812
4 comp1 user2 0.865408
10 comp1 user2 1.462108
8 comp1 user3 0.319039
14 comp1 user3 1.133769
3 comp2 user1 -1.072969
9 comp2 user1 -0.249370
1 comp2 user2 -0.611756
13 comp2 user2 -0.384054
11 comp2 user3 -2.060141
17 comp2 user3 -0.877858