我正在尝试按A组合,找到B的最大值,并且最大值返回与之关联的C.
import pandas as pd
a1 = [1,2,'x']
a2 = [1,3,'y']
a3 = [2,3,'y']
a4 = [2,4,'z']
df = pd.DataFrame([a1,a2,a3,a4], columns = ['A','B','C'])
groups = df.groupby('A')['B'].max()
df = df.join(groups, on='A', rsuffix = '_max')
df
我得到的结果是
A B C B_max
0 1 2 x 3
1 1 3 y 3
2 2 3 y 4
3 2 4 z 4
我想要的结果是
A B C B_max C_max
0 1 2 x 3 y
1 1 3 y 3 y
2 2 3 y 4 z
3 2 4 z 4 z
答案 0 :(得分:1)
这里有几个选项(毫无疑问还有更多)。 (1)这个只是你正在做的事情(它通过使用B列的idxmax
获取C_max列):
>>> foo = lambda x: pd.Series({'B_max':x.B.max(),'C_max':x.C[x.B.idxmax()]})
>>> print df.join(df.groupby('A').apply(foo),on='A')
A B C B_max C_max
0 1 2 x 3 y
1 1 3 y 3 y
2 2 3 y 4 z
3 2 4 z 4 z
(2)或者这可能更清洁:
>>> agg = df.groupby('A').agg(lambda x: x.loc[x.B.idxmax(),:])
>>> print df.join(agg, on='A', rsuffix = '_max')
A B C B_max C_max
0 1 2 x 3 y
1 1 3 y 3 y
2 2 3 y 4 z
3 2 4 z 4 z
(3)或者你可以在groupby/apply
调用的函数中完成所有操作:
def foo(g):
g['B_max'] = g.B.max()
g['C_max'] = g.C[g.B.idxmax()]
return g
print df.groupby('A').apply(foo)
A B C B_max C_max
0 1 2 x 3 y
1 1 3 y 3 y
2 2 3 y 4 z
3 2 4 z 4 z