Pandas Группировка DataFrame применяется и повторно расширяется вдоль сгруппированной оси - PullRequest
0 голосов
/ 22 февраля 2020

Скажем, у меня есть фрейм данных

            A   B   C   D
2019-01-01  1   10  100 12
2019-01-02  2   20  200 23
2019-01-03  3   30  300 34

и массив для группировки столбцов по

array([0, 1, 0, 2])

I w * sh для группировки фрейма данных по массиву (по столбцу ось), примените функцию, затем верните Series с длиной числа столбцов, содержащих результат применения функции для каждого столбца.

Итак, для вышеупомянутого (с примененной функцией, принимающей сумму группы ), хотелось бы вывести:

A    606
B     60
C    606
D     69
dtype: int64

Моя лучшая попытка:

func = lambda a: np.full(a.shape[1], np.sum(a.values))
df.groupby(groups, axis=1).apply(func)

0    [606, 606]
1          [60]
2          [69]
dtype: object

(в этом примере примененная функция возвращает одинаковые значения внутри группы, но это не может быть гарантировано для реального случая)

Я не могу понять, как это сделать с помощью pandas группового синтаксиса, если я что-то упустил. Кто-нибудь может протянуть руку, спасибо!

1 Ответ

0 голосов
/ 23 февраля 2020

Попробуйте это:

import numpy as np
import pandas as pd


groups = [0, 1, 0, 2]

df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [10, 20, 30],
                   'C': [100, 200, 300],
                   'D': [12, 23, 34]})

temp = df.apply(sum).to_frame()

temp.index = pd.MultiIndex.from_arrays(
    np.stack([temp.index, groups]),
    names=("df columns", "groups")
)

temp_filter = temp.groupby(level=1).agg(sum)

result = temp.join(temp_filter, rsuffix='0'). \
    set_index(temp.index.get_level_values(0))["00"]

# df columns
# A    606
# B     60
# C    606
# D     69
# Name: 00, dtype: int64
...