Функция агрегирования для группировки - PullRequest
1 голос
/ 12 июля 2019

Редактировать: уточнил вопрос

Я хочу объединить pd.DataFrame с именем df по "Идентификатору" и суммировать столбцы "Затраты". Для столбцов категории я хочу применить функцию агрегирования, которая может быть произнесена вслух, например: «агрегировать и принимать наиболее частое значение (режим) столбца, но если режим пустой, чем второй столбец по частоте». Другими словами, я хочу иметь режим категории (после агрегирования), но этот режим не должен быть пустым.

Результатом должен быть pd.DataFrame new_df .

df
  Identifier  Cost  Cost2 Category1 Category2 Category3
0          A    10     10       one                 aaa
1          A    20     10                blue       aaa
2          B    10     20       two                 bbb
3          B    10     30               green       bbb
4          B    30     40                           bbb
5          C    20     50     three       red       ccc

--- процесс агрегации --->

new_df
  Identifier  Cost  Cost2 Category1 Category2 Category3
0          A    30     20       one      blue       aaa
1          B    50     90       two     green       bbb
2          C    20     50     three       red       ccc

Код для воспроизведения примера:

import pandas as pd

data_df = {       
           'Identifier': ['A', 'A', 'B', 'B', 'B', 'C'],
           'Cost': [10, 20, 10, 10, 30, 20],
           'Cost2':[10,10,20,30,40,50],
           'Category1' : ['one', '', 'two', '', '', 'three'],
           'Category2' : ['', 'blue', '', 'green', '', 'red'],
           'Category3' : ['aaa', 'aaa', 'bbb', 'bbb', 'bbb', 'ccc']
          }

df = pd.DataFrame(data_df)


data_new_df = {       
           'Identifier': ['A', 'B', 'C'],
           'Cost': [30, 50, 20],
           'Cost2' : [20,90,50],
           'Category1' : ['one', 'two', 'three'],
           'Category2' : ['blue', 'green', 'red'],
           'Category3' : ['aaa', 'bbb', 'ccc']
          }

new_df = pd.DataFrame(data_new_df)

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Может быть, вы можете попробовать groupby с sum следующим:

new_df = df.groupby('Identifier').apply(sum).drop('Identifier', axis=1).reset_index()

Результат:

  Identifier  Cost Category1 Category2
0          A    30       one      blue
1          B    50       two     green
2          C    20     three       red
0 голосов
/ 12 июля 2019

Вы можете попробовать:

new_df = df.groupby('Identifier').sum().reset_index()
new_df['Category1'] = df.loc[df.Category1 != '', 'Category1'].reset_index(drop=True)
new_df['Category2'] = df.loc[df.Category2 != '', 'Category2'].reset_index(drop=True)
new_df

Результат:

  Identifier  Cost Category1 Category2
0          A    30       one      blue
1          B    50       two     green
2          C    20     three       red
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...