【问题标题】:Python dataframe dictionary aggregation merging with sum failedPython数据框字典聚合与sum合并失败
【发布时间】:2016-03-08 18:00:25
【问题描述】:

假设我有这样的数据框:

da1 = DataFrame({'id':['bub','char', 'bub'],
                 'a':[{'t1':1,'t2':3},
                      {'t1':3},
                      {'t2':1}]})
print da1
                      a    id
0  {u't2': 3, u't1': 1}   bub
1            {u't1': 3}  char
2            {u't2': 1}   bub

我想按键汇总'a'列的内容,按'id'分组,我尝试的是:

print da1.groupby('id')\
        .aggregate({
            'a': lambda x: DataFrame.from_dict(x).sum().to_dict()})
id                                                    a 
bub   <built-in method values of dict object at 0x7f...
char  <built-in method values of dict object at 0x7f...

但如果我这样做:

bub = [{'t1':1,'t2':3}, {'t2':1}]
print DataFrame.from_dict(bub).sum().to_dict()
{'t2': 4.0, 't1': 1.0}

我第一次得到我想要的, 我错过了什么?

upd:我也试过使用 Counter(),没有成功...

from collections import Counter
print dict(sum((Counter(dict(x)) for x in bub),Counter()))
{'t2': 4, 't1': 1}

print da1.groupby('id')\
            .aggregate({
                'a': lambda dic: dict(sum((Counter(dict(x)) for x in dic),Counter()))})
id                                                    a 
bub   <built-in method values of dict object at 0x7f...
char  <built-in method values of dict object at 0x7f...

【问题讨论】:

  • 我怀疑您的第一个数据框 da1 是否是您想要的:带有值的 dicts 列通常不是您放入数据框的内容。
  • 你是对的!我实际上将使用非常相似的结构将此类字段插入数据库。

标签: python python-2.7 dictionary pandas merge


【解决方案1】:

我找到了解决这个问题的方法,可能效率很低,但它对我有用。

我发现issue 在使用 apply 方法时出现了类似的错误,并且该错误已修复。由于他们固定为 apply 我使用 apply 函数来做我想做的事。

print DataFrame({'visitorId':da1.groupby('id', as_index=False).groups.keys(),
           'a':da1.groupby('id', as_index=False)\
                        .apply(lambda dic:
                                dict(sum((Counter(dict(x)) for x in dic.a),
                                          Counter())))})

                      a visitorId
0  {u't2': 4, u't1': 1}       bub
1            {u't1': 3}      char

我对分组数据使用了 apply 方法,获取“标识符”的最简单方法是获取组键。如果您对如何更有效地执行此操作有任何建议,请告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 2012-07-02
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多