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

时间:2017-12-19 14:36:35

标签: 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

我想按列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列?

2 个答案:

答案 0 :(得分:5)

您可以DataFrameGroupBy.idxmax使用map获取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()

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