如何用pandas groupby汇总多个列?

时间:2016-02-08 12:32:10

标签: python pandas

我的数据框看起来像

day  type  col  d_1  d_2  d_3  d_4  d_5...
1    A     1    1    0    1    0
1    A     2    1    0    1    0
2    B     1    1    1    0    0

也就是说,我有一个普通列(col)和许多以d _

为前缀的列

我需要按日执行groupby并键入,我想计算每个日期类型组合的每个d_列中的值的总和。我还需要在我的数据中的其他列上执行其他聚合函数(例如示例中的col

我可以使用:

agg_df=df.groupby(['day','type']).agg({'d_1': 'sum', 'col': 'mean'})

但这仅计算一个d_列的总和。如何在数据中指定所有可能的d_列?

换句话说,我想写一些类似

的内容
agg_df=df.groupby(['day','type']).agg({'d_*': 'sum', 'col': 'mean'})

以便预期输出为:

day  type  col  d_1  d_2  d_3  d_4  d_5...
1    A     1.5  2    0    2    0    ...
2    B     1    1    1    0    0

如您所见,col由均值聚合,而d_列则相加。

感谢您的帮助!

2 个答案:

答案 0 :(得分:6)

IIUC您需要使用d_*列对数据帧进行分组。您可以找到包含str.contain的列,并将其传递给groupby数据帧:

cols = df.columns[df.columns.str.contains('(d_)+|col')]
agg_df=df.groupby(['day','type'])[cols].sum()


In [150]: df
Out[150]:
   day type  col  d_1  d_2  d_3  d_4
0    1    A    1    1    0    1    0
1    1    A    2    1    0    1    0
2    2    B    1    1    1    0    0

In [155]: agg_df
Out[155]:
          col  d_1  d_2  d_3  d_4
day type
1   A       3    2    0    2    0
2   B       1    1    1    0    0

注意:我根据您的要求将col列添加到contains模式。您可以指定所需的任何正则表达式,并使用|符号传递它。

答案 1 :(得分:4)

您可以使用filter

In [23]: df.groupby(['day','type'], as_index=False)[df.filter(regex='d_.*').columns].sum()

Out[23]:
   day type  d_1  d_2  d_3  d_4
0    1    A    2    0    2    0
1    2    B    1    1    0    0

如果您想一次性应用所有功能:

dic = {}
dic.update({i:np.sum for i in df.filter(regex='d_.*').columns})
dic.update({'col':np.mean})

In [48]: df.groupby(['day','type'], as_index=False).agg(dic)
#Out[48]:
#   day type  d_2  d_3  d_1  col  d_4
#0    1    A    0    2    2  1.5    0
#1    2    B    1    0    1  1.0    0