Панды: группировка для суммирования подмножеств столбцов - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть пандас с несколькими столбцамиЯ хотел бы вычислить сумму различных подмножеств этих столбцов и назначить имя каждой группе столбцов.

Возможно ли достичь этого с помощью групповых или других методов панд?

Настройка:

import numpy as np; np.random.seed(1)
import pandas as pd

df = pd.DataFrame(np.random.randint(0, 10, (3, 5)), columns=['A', 'B', 'C', 'D', 'E'])

columns_groups = {'First': ['A', 'B', 'C'],
                  'Second': ['D', 'E'],
                  'Some': ['A', 'C', 'D'],
                  'All': ['A', 'B', 'C', 'D', 'E']}

Желаемый вывод: (есть ли более элегантное решение?)

out = {}
for name, group in columns_groups.items():
    out[name] = df[group].sum(axis=1)

out = pd.DataFrame(out)

out
Out[22]: 
   All  First  Second  Some
0   27     22       5    19
1   23      8      15    13
2   17     11       6     9

Моя попытка:

df.groupby(columns_groups, axis=1).sum(axis=1)

Out[21]: 
Empty DataFrame
Columns: []
Index: [0, 1, 2]

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Просто другой и интересный способ, используя reindex с MultiIndex

df=df.reindex(columns=sum(columns_groups.values(),[]))
t=[(x,z ) for x , y in columns_groups.items() for z in y]
df.columns=pd.MultiIndex.from_tuples(t)
df.sum(level=0,axis=1)
   First  Second  Some  All
0     22       8    18   30
1     17       9    16   26
2      6      15    14   21
0 голосов
/ 13 августа 2019

Вы могли бы сделать это в однострочном режиме панды.Больше памяти и супер просто

file['sum']=file.sum(axis=1, skipna = True)

Выход ниже

    All  First  Second  sum
0   27   22     5       54.0
1   23   8      15      46.0
2   17   11     6       34.0
0 голосов
/ 22 ноября 2018

С тобой все в порядке:

pd.DataFrame({k: df[v].sum(axis=1) for k, v in columns_groups.items()})

   All  First  Second  Some
0   27     22       5    19
1   23      8      15    13
2   17     11       6     9

Это то же самое, что ты делал, только в понимании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...