Python Pandas:如何对数据框中一列的字典所有值进行求和?

4

这是我的数据框:

    name                            count_dic
0  name1  {'x2,bv.': 435, 'x3': 4, 'x1': 123}
1  name2            {'x5': 98, 'x2,bv.': 435}

我希望将 'count_dic' 列中所有字典的值相加,得到如下结果:

    name                            count_dic   sum_vals
0  name1  {'x2,bv.': 435, 'x3': 4, 'x1': 123}    562
1  name2            {'x5': 98, 'x2,bv.': 435}    533

以下是我尝试过的内容:

df_map.count_dic.apply(lambda L: sum(L.values())).sum()

但是我遇到了以下错误:
TypeError: unsupported operand type(s) for +: 'dict_values' and 'dict_values'

有人可以帮忙吗?

2个回答

3
注意:您的数据框架结构对我来说有些奇怪,如果数据集变大可能会表现得非常不理想。 无论如何,您的代码似乎格式良好 [已在python 2.7.8和3.4.1上测试]。
 df = pd.DataFrame(columns = ['name','count_dic'])
 df.loc[0] = ['name0',{'x2,bv.': 435, 'x3': 4, 'x1': 123}]
 df.loc[1] = ['name1',{'x5': 98, 'x2,bv.': 435}]

 df.count_dic.apply(lambda x : sum(x.values())).sum()

       1095

如果您想按行获取值

 df.count_dic.apply(lambda x : sum(x.values()))

        0    562
        1    533
    Name: count_dic, dtype: int64

这个使用方式还存在一个特定的问题,与所涉及的变量类型不是int有关,需要进行显式转换。

 df.count_dic.apply(lambda x : sum([int(y) for y in x.values())])

@Acrobe,我正在使用相同的代码,但我遇到了上述错误,但我找不到原因。你有什么建议吗? - UserYmY
@UserYmY,你用的是哪个Python版本?使用df.count_dic.apply(lambda x : x.values())能得到有意义的结果吗? - Acorbe
我正在使用Python 3上的ipython。 - UserYmY
Python内核版本是哪个?2.7还是3.x? - Acorbe
2
也许您需要一个显式转换:df.count_dic.apply(lambda x : sum([int(y) for y in x.values())]) - Acorbe
显示剩余12条评论

0

步骤1:确保在读取数据时,列具有正确的数据类型,即<键,值>。如果首先将其读取为字符串,则需要将其转换为字典格式。

import ast
dict_col_data=[]
for row in df["test_col"]:
  dict_col_data.append(ast.literal_eval(row))
df["test_col_dict"]=dict_col_data

步骤2:现在通过显式声明dtype来计算每一行的总和,以避免读取时出现任何不匹配。

df.test_col_dict.apply(lambda x :sum([int(y) for y in x.values()]) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接