首页 > 解决方案 > 如何通过对非标量值求和来将不同类型的字典转换为熊猫系列?

问题描述

我是熊猫的绝对初学者,所以下面的问题可能不是很相关。尽管如此:

鉴于我想使用以下数据创建一个 Series 对象:

from pandas import Series

data = {'c1' : 10, 'c2' : {'r1' : 1, 'r2' : 2}}
s = Series(data)

是否有可能以这样的方式操纵这个系列,结果是

print(s)
c1    10
c2     3
dtype: int64

总结内部字典中的所有条目(由 r1 和 r2 键组成)的结果是什么?

另一种选择可能是明确处理系列之外的情况。

标签: pythonpandasseries

解决方案


假设您的字典只有一个嵌套级别并且所有值都是数字,您可以将其展平如下:

data = {k: sum(v.values()) if type(v) == dict else v for k, v in data.items()}

如果您可能有多个级别,则可以使用一个短函数来对嵌套值求和:

import pandas as pd


def nested_itemsum(inp):
    total = 0
    if type(inp) == dict:
        total =  sum(nested_itemsum(v) for v in inp.values())
    else:
        total += inp
    return total

data = {'c1' : 10, 'c2' : {'r1' : 1, 'r2' : 2}}
data = {k: nested_itemsum(v) for k, v in data.items()}

s = pd.Series(data)

print(s)

data = {'c1' : 10, 'c2' : {'r1' : {'x1': 5, 'x2': 10}, 'r2' : 2}}
data = {k: nested_itemsum(v) for k, v in data.items()}

s = pd.Series(data)

print(s)

这打印:

c1    10
c2     3
dtype: int64
c1    10
c2    17
dtype: int64

正如预期的那样。

如果您不想修改输入数据,可以将其应用于您创建的系列,如下所示:

data = {'c1' : 10, 'c2' : {'r1' : 1, 'r2' : 2}}

s = pd.Series(data)
s = s.apply(nested_itemsum)

并得到相同的结果。


推荐阅读