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

问题描述 投票:5回答:2

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

pandas pandas-groupby
2个回答
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()

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

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
© www.soinside.com 2019 - 2024. All rights reserved.