Что передать в aggfun c в pandas сводную таблицу для суммирования счетчиков - PullRequest
1 голос
/ 30 мая 2020

У меня есть таблица данных с двумя столбцами «A» и «B», а элементы в столбце «B» являются счетчиками. Например,

c = Counter(a=4, b=2)
df = pd.DataFrame({"A": ["group1", "group1", "group1", "group2", "group2"],
                   "B": [c, c, c, c, c]})

Я хотел бы создать сводную таблицу, в которой я группирую по значениям элементов в столбце «A» и агрегирую по столбцу «B», складывая счетчики. Интересно, что мне передать в aggfun c?

Это то, что я пробовал, но, к сожалению, это не работает:

pt = pd.pivot_table(df, index = ['A'], values = ['B'], aggfunc = ['+'])

Есть предложения?

Мой ожидаемый результат:

table              
  group1  Counter(a=12, b=6)   # i.e., c+c+c
  group2  Counter(a=8, b=4)    # i.e., c+c

1 Ответ

2 голосов
/ 30 мая 2020

Это просто sum.

>>> df.groupby('A')['B'].sum()
A
group1    {'a': 12, 'b': 6}
group2     {'a': 8, 'b': 4}
Name: B, dtype: object

Два примечания:

  1. Размещение словарей в столбцах фрейма данных обычно не является хорошей практикой. Я бы использовал два столбца для хранения значений 'a' и 'b' соответственно.
  2. "B": [c, c, c, c, c] инициализирует каждый элемент столбца 'B' одним и тем же объектом счетчика.

Демо:

>>> df.loc[0, 'B']['a'] = 100
>>> df
Out[9]: 
        A                   B
0  group1  {'a': 100, 'b': 2}
1  group1  {'a': 100, 'b': 2}
2  group1  {'a': 100, 'b': 2}
3  group2  {'a': 100, 'b': 2}
4  group2  {'a': 100, 'b': 2}

Возможно, вам понадобится "B": [c.copy() for _ in range(5)] - если вы вообще хотите сохранить исходный дизайн, то есть

...