为 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中的分层列

pandas中apply和transform方法的性能比较

Groupby并通过在Pandas中随机分配多个字符串来创建一个新列

Groupby 在一列 pandas 数据帧上,并使用 GridsearchCv 使用通用 sklearn 管道训练每个组的特征和目标 (X, y)

将 CSV 数据文件上传到 Pandas Dataframe 时如何分配标签和特征