Python Pandas группировки столбцов - PullRequest
0 голосов
/ 05 октября 2018

Это вопрос Панды - мой мозг слишком устал, чтобы понять это сегодня.Может ли кто-нибудь помочь мне?У меня есть датафрейм с множеством столбцов с одним столбцом в качестве категории:

Category B C D .... Z 
1        2 11 1.0 'HOME' ....
1        3 21 1.0 'HOME' ....
1        1 33 .9 'GOPHER' ....
2        4 34 0.6  'HUMM'  ...
2        1 72 1.4  'VEEE'   ...
3        5 23  2.3  'ETC '  ....
4        3 99  3.141 'PI'  ...
4        4 1  2.634 'PI'   ...

И я хочу получить это (текстовые столбцы действительно не имеют значения)

Category B C D .... Z 
1        6 11 2.9 'HOME' ....
2        5 34 2.6  'HUMM'  ...
3        5 23  2.3  'ETC '  ....
4        7 100  5.775 'PI'  ...

Как мне поступитьделать это в Python Pandas?Использую ли я group ()?

Если df - это мой DataFrame, а результат в newdf будет результирующим фреймом данных, тогда в ndf ['B'] будет одна строка с newdf ['A'] = 1 и newdf [' B '] будет суммой значений в df [' B '] для всех строк, где df [' A '] было равно 1.
Для следующей категории будет одна строка вndf ['B'] с newdf ['A'] = 2 и newdf ['B'] будет суммой значений в df ['B'] для всех строк, где df ['A'] было 2

и так далее.

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

Надеюсь, я все правильно объяснил.Вручную это будет похоже на

ndf['B'] = df[ df['A'] == 1 ].sum() 
ndf['C'] = df[ df['A'] == 1 ].sum() 

В принципе, можно ли использовать что-то вроде этого:

for col in df.columns:
    if col.type(??) is number: 
        ndf[col] = df[ df[col] == 1 ].sum() 

и для каждой категории в A;повторить

ndf['B'] = df[ df['A'] == 2 ].sum() 
ndf['C'] = df[ df['A'] == 3 ].sum() 

Затем мне пришлось бы выполнить цикл для каждого значения в категории для A.

Это правильный способ решения проблемы?

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете использовать GroupBy + agg, чтобы указать разные функции для каждой серии.Я связал серии C и Z с 'first', т.е. извлек первое значение из каждой группы, поскольку это соответствует желаемому результату.

agg_rules = {'B': 'sum', 'C': 'first', 'D': 'sum', 'Z': 'first'}
res = df.groupby('Category').agg(agg_rules).reset_index()

print(res)

   Category  B   C      D       Z
0         1  6  11  2.900  'HOME'
1         2  5  34  2.000  'HUMM'
2         3  5  23  2.300   'ETC'
3         4  7  99  5.775    'PI'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...