按行分组时如何合并熊猫数据框的字典

时间:2018-10-12 16:14:13

标签: python pandas dictionary dataframe pandas-groupby

我的数据框的格式为:

.highlight{
  color:red
}

在合并“ area1”和“ area2”的字典时,我想对所有具有匹配的“ id”和“ date”的行进行分组。意思是我想得到:

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
  01 20181010 {'a': 10, 'b': 15, 'c': 17} {'a': 20, 'c': 13, 'b': 12}
  02 20180506 {'a': 2, 'b': 3}            {'c': 4, 'a': 18}

很显然,这仅获得区域1和区域2的第一个字典。 但是,如果我正确理解,可以将函数传递给agg,那么是否可以像这样合并字典? 我只是没有办法告诉它接受下一个字典并将其合并(考虑到它可能不存在并且是Nan)。

非常感谢!

如果解决方案不是超级慢,那也很好,因为我必须对大型数据集进行处理:/

1 个答案:

答案 0 :(得分:0)

您快到了。您只需要使用一个自定义函数即可将非空序列值之间的字典合并:

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}