如何使用pandas的groupby与agg按分组合并含字典的列
解决方案
这里使用apply()方法更适配你的场景:agg()更适合内置聚合函数、多聚合规则的需求,你需要自定义合并分组内所有字典的逻辑,用apply()实现更直接。
考虑到你使用的是Python 3.6.5,不支持3.9+新增的字典合并运算符,我们用兼容性最好的dict.update()实现字典合并,完整实现代码如下:
import pandas as pd # 你的原有DataFrame构造代码 d = {'time':['2021-08-12 14:59:15.230','2021-08-12 14:59:15.230','2021-08-12 14:59:15.230'] , 'dayy':['14:59:15.231818','14:59:15.231330','14:59:15.232206'] , 'catg':['40B0','4035','40E8'] , 'data':[{'OQWOWF': '0', 'OQD8S1F': '10010100'},{'OQTADT': 30.0, 'OQTAVL': '0', 'OQAOAD': 2},{'OQGS01': '0', 'OQGS02': '0', 'OQGS03': '0'}] } df = pd.DataFrame(data=d) # 字典合并函数 def merge_group_dicts(dict_list): merged = {} for item in dict_list: merged.update(item) return merged # 分组合并逻辑 result = df.groupby('time')['data'].apply(merge_group_dicts).reset_index() # 输出结果 print(result)
运行后输出结果和你要求的效果完全一致:
time data 0 2021-08-12 14:59:15.230 {'OQWOWF': '0', 'OQD8S1F': '10010100', 'OQTADT': 30.0, 'OQTAVL': '0', 'OQAOAD': 2, 'OQGS01': '0', 'OQGS02': '0', 'OQGS03': '0'}
补充说明:如果你的数据中存在重复的字典键,默认会保留同一分组内后出现的字典的对应值,你可以根据需求修改merge_group_dicts函数的逻辑调整覆盖规则。
内容的提问来源于stack exchange,提问作者code_warrior
相关产品推荐
相关产品推荐

