我在pandas数据框中有数据,需要聚合它。我需要在不同的列上进行不同的聚合,类似于下面的内容。
title t_no t_descr rank stores
A 1 a 1 1000
B 1 a 1 1800
C 2 b 2 800
D 1 a 1 1800
E 3 c 3 700
F 4 d 4 500
为:
aggs = {
'rank': 'min',
't_no': 'min', # need t_no for row that is min(rank) by title.
't_descr': 'min' # need t_descr for row that is min(rank) by title.
}
df2.groupby('title').agg(aggs).reset_index()
您会注意到标题B和D已经汇总,保留了t_no& t_descr对应于相应标题组的排名的最小值,而存储被加总。 t_no& t_descr只是任意文本。我需要按标题排名最高,对商店求和,并保留相应的t_no& t_descr。
如何在一个pandas groupby中执行此操作?这是虚拟数据;我正在处理的真正问题有更多的聚合,我不想单独进行每个聚合,我知道该怎么做。
我从下面开始,但意识到我真的需要分钟& t_no&的最大值t_descr基于子组的排名col,而不是列本身。
{{1}}
或许有一种方法可以用lambda做到这一点?我确信这是一种直截了当的方法。如果groupby不是正确的方法,我显然愿意接受建议。
谢谢!
答案 0 :(得分:1)
两步过程......
商店总和的汇总和idxmin
的{{1}} ...
然后使用rank
切片原始数据框并将其与聚合
idxmin
答案 1 :(得分:0)
这与@piRSquared略有不同,但可以让你到达同一地点:
<强>代码:强>
# Set min and sum functions according to columns and generate new dataframe
f = {'rank':min, 'rank':min, 'stores':sum}
grouped = df.groupby('title').agg(f).reset_index()
# Then merge with original dataframe (keeping only the merged and new columns)
pd.merge(grouped, df[['title','rank','t_no','t_descr']], on=['title','rank'])
<强>输出:强>
title stores rank t_no t_descr
0 A 1000 1 1 a
1 B 1800 1 1 a
2 C 800 2 2 b
3 D 1800 1 1 a
4 E 700 3 3 c
5 F 500 4 4 d
当然,您可以根据需要整理列。