示例数据框:
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)})
print 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
Groupby 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
有人能说明怎么做吗?任何帮助表示赞赏。
答案 0 :(得分:4)
两个阶段:首先找到索引,然后查找所有行。
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
答案 1 :(得分:2)
我的回答类似于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