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

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

【讨论】:

以上是关于按行分组时如何合并熊猫数据框的字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框中执行按行if和数学运算

按行查找矩阵或数据框的最小值(排序)

如何在不添加“Row.names”列的情况下按行名合并数据框?

熊猫数据框中的分割行

python--pandas合并与连接

如何将多个csv按行合并?(不是首尾相接的按列合并)