Pandas Groupby可以聚合成一个对象列表

时间:2015-09-30 14:46:01

标签: python python-2.7 pandas

虽然panda的groupby能够使用summean等函数聚合数据,但有没有办法聚合到对象列表中,这些对象的键对应于这些值的列名是从?

聚合而来的

问题:

如果数据看起来像这样

    A    B    C  
    1    10   22
    1    12   20
    1    11   8
    1    10   10
    2    11   13
    2    12   10 
    3    14   0

我们怎样才能让熊猫将其转化为这个假设的输出:

    A    D  
    1    [{'B':10, 'C':22}, {'B':12, 'C':20}, {'B':11, 'C':8}, {'B':10, 'C':10}]
    2    [{'B':11, 'C':13}, {'B':12, 'C':10}]
    3    [{'B':14, 'C':0}]

2 个答案:

答案 0 :(得分:1)

我实际上并不确定这会起作用,但似乎也是如此。

In [35]: df.groupby('A').apply(lambda x: x.to_dict(orient='records'))
Out[35]: 
A
1    [{u'A': 1, u'C': 22, u'B': 10}, {u'A': 1, u'C'...
2    [{u'A': 2, u'C': 13, u'B': 11}, {u'A': 2, u'C'...
3                       [{u'A': 3, u'C': 0, u'B': 14}]
dtype: object

根据您尝试完成的内容,可能更自然地迭代groupby对象并进行转换,如下所示:

In [36]: for a, df_gb in df.groupby('A'):
    ...:     d = df_gb.to_dict(orient='records')
    ...:     

答案 1 :(得分:0)

直接使用群组。这是一个类似于你想要的字典。

g = df.groupby("A")
{a:list(s.drop("A", axis=1).T.to_dict().values()) for a,s in g}

{'1': [{'B': '10', 'C': '22'},
  {'B': '12', 'C': '20'},
  {'B': '11', 'C': '8'},
  {'B': '10', 'C': '10'}],
 '2': [{'B': '11', 'C': '13'}, {'B': '12', 'C': '10'}],
 '3': [{'B': '14', 'C': '0'}]}