Pandas聚合 -- 如何保留所有列

5

示例数据框:

rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['group1', 'group2', 'group3'] * 2,
                'B': rand.rand(6),
                'C': rand.rand(6),
                'D': rand.rand(6)})

打印 df

        A         B         C         D
0  group1  0.417022  0.186260  0.204452
1  group2  0.720324  0.345561  0.878117
2  group3  0.000114  0.396767  0.027388
3  group1  0.302333  0.538817  0.670468
4  group2  0.146756  0.419195  0.417305
5  group3  0.092339  0.685220  0.558690

按列A分组

group = df.groupby('A')

使用agg函数返回每个组的最大值。
max1 = group['B'].agg({'max' : np.max})
print max1

             max
A               
group1  0.417022
group2  0.720324
group3  0.092339

但我希望保留(或重新获取)其他列C和D中的相应数据。这将是包含最大值的行中剩余的数据。 因此,返回结果应该是:

     A         B         C         D
group1  0.417022  0.186260  0.204452
group2  0.720324  0.345561  0.878117
group3  0.092339  0.685220  0.558690

有人可以展示如何做到这一点吗?非常感谢任何帮助。


我已经编辑了你之前的问题,删除了你的签名。请参阅FAQ每个帖子都已经用你的标准用户卡片进行了“签名”,该卡片直接链接回你的用户页面。在问题结尾不需要使用你的名字进行签名。 - chrisaycock
2个回答

6
两个阶段:首先找到索引,然后查找所有行。
idx = df.groupby('A').apply(lambda x: x['B'].argmax())
idx

Out[362]: 
A
group1    0
group2    1
group3    5

df.loc[idx]

Out[364]: 
        A         B         C         D
0  group1  0.417022  0.186260  0.204452
1  group2  0.720324  0.345561  0.878117
5  group3  0.092339  0.685220  0.558690

有没有选项可以获取B列中第二大的值所在的行? - qwerty
这个不再起作用了。我不知道它什么时候能起作用,但现在 idx 应该是 [0, 0, 1] 而不是这个答案中建议的 [0, 1, 5]。 - figs_and_nuts

4
我的答案与FooBar类似,但是可以通过使用idmax()在一行中完成。
df.loc[df.groupby('A')['B'].idxmax()]

结果相同:

In [51]: df
Out[51]: 
        A         B         C         D
0  group1  0.417022  0.186260  0.204452
1  group2  0.720324  0.345561  0.878117
2  group3  0.000114  0.396767  0.027388
3  group1  0.302333  0.538817  0.670468
4  group2  0.146756  0.419195  0.417305
5  group3  0.092339  0.685220  0.558690

In [76]: df.loc[df.groupby('A')['B'].idxmax()]
Out[76]: 
        A         B         C         D
0  group1  0.417022  0.186260  0.204452
1  group2  0.720324  0.345561  0.878117
5  group3  0.092339  0.685220  0.558690

1
Python的好处是你几乎总是可以将代码折叠成一行。出于教育因素,我选择不这样做。 - FooBar
谢谢,大家。你们可以肯定我很感激这些信息和教育... - rdh9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接