在数据帧列中对具有相同键的字典求和/相乘

时间:2016-11-08 18:57:08

标签: python python-2.7 pandas dictionary

给定一个包含多列词典的数据框,如何将数据帧中的键相加和/或相乘以得到一列

info->tm_mday

所以加在一起你会得到另一个专栏

                       A                        B
   {"ab":1, "b":2, "c":3}   {"ab":1, "b":3, "c":5}

或者一起乘以

                    C
{"ab":2, "b":5, "c":8}

我知道如果它们只是数字列,我可以使用sum / etc。但是如果它们是字典列的话,最好的方法是什么?一个lambda函数?

2 个答案:

答案 0 :(得分:2)

您可以先将dicts扩展为多列DF df.A.apply(pd.Series),进行算术运算,最后将结果转换回dict:(result).to_dict('r')

In [84]: df
Out[84]:
                              A                             B
0     {'b': 2, 'c': 3, 'ab': 1}     {'b': 3, 'c': 5, 'ab': 1}
1  {'b': 12, 'c': 13, 'ab': 11}  {'b': 23, 'c': 25, 'ab': 21}

In [85]: df['C'] = (df.A.apply(pd.Series) + df.B.apply(pd.Series)).to_dict('r')

In [86]: df
Out[86]:
                              A                             B                             C
0     {'b': 2, 'c': 3, 'ab': 1}     {'b': 3, 'c': 5, 'ab': 1}     {'b': 5, 'c': 8, 'ab': 2}
1  {'b': 12, 'c': 13, 'ab': 11}  {'b': 23, 'c': 25, 'ab': 21}  {'b': 35, 'c': 38, 'ab': 32}

说明:

In [91]: df.A.apply(pd.Series)
Out[91]:
   ab   b   c
0   1   2   3
1  11  12  13

答案 1 :(得分:2)

天真的方法:

使用可以处理 dict或dicts列表json_normalize作为数据输入非常好:

from pandas.io.json import json_normalize 
processed_df = json_normalize(df.T.to_dict('list'), 0)

enter image description here

要查找 总和

processed_df.sum()    # Append .to_dict() if you want to render it as a dictionary
ab    2
b     5
c     8
dtype: int64

要查找 产品

processed_df.prod()    # Append .to_dict() if you want to render it as a dictionary 
ab     1
b      6
c     15
dtype: int64

如果数据帧有太多的列/行,这可能是一种过度杀伤,尽管可以通过将其熔化成具有单个列标题的长形式来克服。但同样,重新塑造它以匹配匹配的行和计算将是一个太多的交易。

更通用的方法:

示例DF

df = pd.DataFrame({'A': [{"ab":1, "b":2, "c":3}, {'b':4, 'c':5, 'ab':6}], 
                   'B': [{"ab":7, "b":8, "c":9}, {'b':10, 'c':11, 'ab':12}]})
df

enter image description here

计算 总和

df.stack().apply(pd.Series).sum(level=0)

enter image description here

计算 产品

df.stack().apply(pd.Series).prod(level=0)

enter image description here

分配回新列:

df['C'] = df.stack().apply(pd.Series).sum(level=0).to_dict('records')
df

enter image description here