如何通过另一个列上的值聚合一个列?

Vic*_*nte 7 pandas pandas-groupby

假设我有以下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
Run Code Online (Sandbox Code Playgroud)

我想按A和B列分组,对C列求和,并保留D的值,该值与C的最大分组值在同一行。

A   B   C      D
x   a   101    v
y   b   1010   w
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有这个:

df.groupby(['A','B']).agg({'C':sum})

A   B   C
x   a   101
y   b   1010
Run Code Online (Sandbox Code Playgroud)

我必须使用什么功能汇总D列?

jez*_*ael 5

您可以使用DataFrameGroupBy.idxmax为最大值的指标Cloc

#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()
Run Code Online (Sandbox Code Playgroud)

类似的解决方案map

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'})
Run Code Online (Sandbox Code Playgroud)
print (df1)
   A  B     C  D
0  x  a   101  v
1  y  b  1010  w
Run Code Online (Sandbox Code Playgroud)