我的数据框看起来像
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_列则相加。
感谢您的帮助!
答案 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