如何通过另一列上的值聚合一列?
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
假设我有以下 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