Как преобразовать dict разных типов в ряды панд, выполнив сумму на не скалярных значениях? - PullRequest
0 голосов
/ 14 сентября 2018

Я абсолютный новичок в пандах, поэтому приведенный ниже вопрос может быть не очень актуальным. Тем не менее:

Учитывая, что я хочу создать объект Series со следующими данными:

from pandas import Series

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

Можно ли манипулировать этой серией таким образом, чтобы результат был

print(s)
c1    10
c2     3
dtype: int64

Что является результатом суммирования всех записей во внутреннем dict (сделанном клавишами r1 и r2)?

Альтернативой может быть явное обращение со случаем вне Серии.

1 Ответ

0 голосов
/ 14 сентября 2018

Если ваш словарь имеет только один вложенный уровень и все значения являются числами, вы можете сгладить его следующим образом:

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)

и получите тот же результат.

...