按行分组时如何合并熊猫数据框的字典
Posted
技术标签:
【中文标题】按行分组时如何合并熊猫数据框的字典【英文标题】:How to merge dictionaries of a pandas dataframe when grouping by rows 【发布时间】:2019-03-17 21:55:02 【问题描述】:我有一个表单的数据框:
id date area1 area2
01 20181010 'a': 10, 'b': 15 'a': 20, 'c': 13
01 20181010 'c': 17 'b': 12
02 20180506 'a': 2, 'b': 3 'c': 4
02 20180506 Nan 'a': 18
我想对所有匹配“id”和“date”的行进行分组,同时合并“area1”和“area2”的字典。意思是我想得到:
id date area1 area2
01 20181010 'a': 10, 'b': 15, 'c': 17 'a': 20, 'c': 13, 'b': 12
02 20180506 'a': 2, 'b': 3 'c': 4, 'a': 18
首先我尝试了类似的东西:
merged_df = df.groupby(["id", "date"],as_index=False).agg('area1':'first', 'area2': 'first')
显然这只会得到 area1 和 area2 的第一个字典。 但是,如果我理解正确,可以将函数传递给 agg,那么可以像这样合并字典吗? 我只是没有办法告诉它接受下一个字典并合并它(考虑到它可能不存在并且是一个 Nan)。
非常感谢!
啊,如果解决方案不是超级慢,那也太好了,因为我必须为大型数据集这样做:/
【问题讨论】:
你想如何处理重叠的键? 首先展平数据帧可能更容易(如果有固定数量的可能键)。只需用 NaN 填充不存在的值。然后,您可以使用所有正常的连接技术,让您完全控制(如果两者都有值,则首选哪个数据框等)。 @user3483203 不会有重叠的键 :) @Graipher 我明白了,'问题'是'area1'和'area2'下的字典的键是相同的。所以我必须将它展平,将区域附加到键以形成列的名称,对吗?像'area1_a'、'area1_b'、...、'area2_a'、'area2_b'等。我有点喜欢用字典代替,但如果这不是一个好习惯,那么我会改变你的建议:) 【参考方案1】:你快到了。你只需要使用一个自定义函数来合并非空系列值的字典:
def merge_dicts(x):
return k: v for d in x.dropna() for k, v in d.items()
res = df.groupby(['id', 'date'], as_index=False).agg(merge_dicts)
print(res)
id date area1 area2
0 01 20181010 'a': 10, 'b': 15, 'c': 17 'a': 20, 'c': 13, 'b': 12
1 02 20180506 'a': 2, 'b': 3 'c': 4, 'a': 18
【讨论】:
以上是关于按行分组时如何合并熊猫数据框的字典的主要内容,如果未能解决你的问题,请参考以下文章