如何使用pandas groupby实现多个聚合,引用特定列

时间:2017-04-08 01:18:59

标签: pandas

我在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不是正确的方法,我显然愿意接受建议。

谢谢!

2 个答案:

答案 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

当然,您可以根据需要整理列。