为 pandas groupby 中的不同特征分配不同的聚合函数
Posted
技术标签:
【中文标题】为 pandas groupby 中的不同特征分配不同的聚合函数【英文标题】:Assign different aggregation functions to different features in pandas groupby 【发布时间】:2020-06-03 22:01:23 【问题描述】:我有如下数据(我有 100 列,而不是 4 列)
raw_data =
'age': [52, 52, 24, 24, 24],
'a': [4, 24, 31, 2, 3],
'b': [3, 2, 3, 4, 3],
'c': [2, 5, 8, 2, 1]
df = pd.DataFrame(raw_data, columns = [ 'age', 'a', 'b', 'c'])
导致
age a b c
0 52 4 3 2
1 52 24 2 5
2 24 31 3 8
3 24 2 4 2
4 24 3 3 1
我想按年龄对数据进行分组,并找到一些特征的平均值和剩余特征的总和。我试过这个:
feats = ['a', 'b']
df.groupby('age').agg(feats:['mean'], 'c':['sum'])
由于我在真实数据中有 100 个特征,我无法将函数(我有多个函数要分配:RMS、Kurtosis、能量指数等)分配给单个特征(我可以,但它非常耗时且不聪明)是有什么办法可以做到这一点?
【问题讨论】:
那么,在这 100 个特征中,有没有你想要求和的模式以及你想要的平均值?您可以使用字典理解和一些过滤逻辑来创建聚合字典。 @ScottBoston 我有传感器功能和事件代码。我想找到传感器特征的平均值和事件代码的总和。但是,字典是个好主意。我会试试的。谢谢。 【参考方案1】:使用字典理解。
agg_d = i:'mean' for i in feats
agg_d['c'] = 'sum'
df.groupby('age').agg(agg_d)
输出:
a b c
age
24 12 3.333333 11
52 14 2.500000 7
更新,你可以通过一个列表使用多个聚合函数:
agg_d = i:['sum','max','first', lambda x: sum(x**2)] for i in feats
agg_d['c'] = 'sum'
【讨论】:
感谢 Aggie 同胞 :) 如果我有多个功能而不是一个,我该怎么办? @ArchDesai Gig'em!您可以使用列表而不是像这样的“平均”agg_d = i:['sum','max','first',lambda x: x**2] for i in feats
非常感谢。这就是我一直在寻找的。我接受了答案。您能否编辑您的答案(抱歉,我稍后添加了多个有问题的功能)?
@Scott Boston,在应用上述 agg_d 时:ValueError: Must produce aggregated value
。也许应该是agg_d = i:['sum','max','first', lambda x: sum(x**2)] for i in feats
?
@lpj... 哎呀,你是对的。很好的修正。谢谢!以上是关于为 pandas groupby 中的不同特征分配不同的聚合函数的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas 如何将 groupby 操作结果分配回父数据框中的列?
Groupby并通过在Pandas中随机分配多个字符串来创建一个新列
Groupby 在一列 pandas 数据帧上,并使用 GridsearchCv 使用通用 sklearn 管道训练每个组的特征和目标 (X, y)