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