假设我有以下df。
df = pd.DataFrame({
'A':['x','y','x','y'],
'B':['a','b','a','b'],
'C':[1,10,100,1000],
'D':['w','v','v','w']
})
A B C D
0 x a 1 w
1 y b 10 v
2 x a 100 v
3 y b 1000 w
我想按列A和B进行分组,总和列C,并保留D的值,这是C的最大组值的同一行。像这样:
A B C D
x a 101 v
y b 1010 w
到目前为止,我有这个:
df.groupby(['A','B']).agg({'C':sum})
A B C
x a 101
y b 1010
我需要用什么函数来聚合D列?
答案 0 :(得分:5)
您可以DataFrameGroupBy.idxmax
使用map
获取C
与loc
的最大值的索引:
#unique index
df.reset_index(drop=True, inplace=True)
df1 = df.groupby(['A','B'])['C'].agg(['sum', 'idxmax'])
df1['idxmax'] = df.loc[df1['idxmax'], 'D'].values
df1 = df1.rename(columns={'idxmax':'D','sum':'C'}).reset_index()
与https://play.golang.org/p/vnjnpgMzsV类似的解决方案:
df1 = df.groupby(['A','B'])['C'].agg(['sum', 'idxmax']).reset_index()
df1['idxmax'] = df1['idxmax'].map(df['D'])
df1 = df1.rename(columns={'idxmax':'D','sum':'C'})
print (df1)
A B C D
0 x a 101 v
1 y b 1010 w
答案 1 :(得分:1)
set_index
df.set_index('D').groupby(['A','B']).C.agg(['sum','idxmax']).\
reset_index().rename(columns={'idxmax':'D','sum':'C'})
Out[407]:
A B C D
0 x a 101 v
1 y b 1010 w