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

How to aggregate a column by a value on another column?

假设我有以下 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 列?

您可以将 DataFrameGroupBy.idxmax 用于 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()

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'})

print (df1)
   A  B     C  D
0  x  a   101  v
1  y  b  1010  w

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