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

Jua*_*dos 7 python dictionary dataframe pandas pandas-groupby

我有一个以下形式的数据框:

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}
Run Code Online (Sandbox Code Playgroud)

我想将具有匹配“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}
Run Code Online (Sandbox Code Playgroud)

首先我正在尝试类似的事情:

merged_df = df.groupby(["id", "date"],as_index=False).agg({'area1':'first', 'area2': 'first'}) 
Run Code Online (Sandbox Code Playgroud)

显然这只能得到area1和area2的第一个字典。但是如果我理解正确的话,可以将函数传递给 agg,那么是否可以像这样合并字典?我只是不知道如何告诉它接受下一个字典并合并它(考虑到它可能不存在并且是一个 Nan)。

多谢!

啊,如果解决方案不是超级慢那就太好了,因为我必须针对大型数据集执行此操作:/

jpp*_*jpp 7

You are nearly there. You just need to use a custom function which merges dictionaries across non-null series values:

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}
Run Code Online (Sandbox Code Playgroud)