Python Pandas Group Dataframe по столбцу/столбцу Sum Integer по строковому столбцу

Я застрял весь день, просмотрел множество статей SO и все еще застрял на своей последней последней части. Я импортировал CSV в массивный фрейм данных, а затем в конечном итоге получил меньший фрейм данных ниже: (Примечание: мой df сейчас индексируется по «Имени», что мне нужно для создания группы или суммы)

  Name          Classification       Value 1     Value 2
Company 1   Classification Code 1      5000       8000      
Company 1   Classification Code 1      6000       2000
Company 2   Classification Code 1      2000       3000    
Company 2   Classification Code 1      1000       4500     
Company 3   Classification Code 2      15000      10000      
Company 3   Classification Code 2      20000      32000     
Company 4   Classification Code 3      7500       10000    
Company 4   Classification Code 3      7000       1500     

Сейчас я борюсь с тем, как суммировать два значения на основе компании (в основном я использовал groupby и sum(), но застрял на несколько часов. Я знаю, что есть много статей SO, в которых говорится о суммировании вещей в pandas но мне не повезло в течение нескольких часов.Любая помощь будет принята с благодарностью.Большое спасибо.

Изменить: результат, который я ищу, следующий

Company 1    Classification Code 1    11,000    10,000
Company 2    Classification Code 1    3,000      7,500
Company 3    Classification Code 2    35,000    42,000
Company 4    Classification Code 3    14,500    11,500

person ls101    schedule 14.06.2017    source источник


Ответы (1)


Вариант 1
set_index, затем groupby
Предполагается, что столбец 'Classification' одинаков во всех столбцах Company.

df.set_index('Classification', append=True) \
    .groupby(level=[0, 1]).sum().reset_index(1)

                  Classification  Value 1  Value 2
Name                                              
Company 1  Classification Code 1    11000    10000
Company 2  Classification Code 1     3000     7500
Company 3  Classification Code 2    35000    42000
Company 4  Classification Code 3    14500    11500

Вариант 2
groupby, затем agg
Это не делает никаких предположений об уникальности 'Classification' в 'Company', а просто захватывает первые 'Classification' за 'Company'

df.groupby(level=0).agg(
    {'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})

                  Classification  Value 1  Value 2
Name                                              
Company 1  Classification Code 1    11000    10000
Company 2  Classification Code 1     3000     7500
Company 3  Classification Code 2    35000    42000
Company 4  Classification Code 3    14500    11500

Ответ на комментарии
Что касается конкатенации
Отметьте dtypes с df.dtypes. Если вы видите object вместо int, тогда да, вам нужно преобразовать в numeric.

Вы можете сделать это просто с помощью

df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
    {'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})

Или больше вручную

df['Value 1'] = df['Value 1'].astype(int)
df['Value 2'] = df['Value 2'].astype(int)

Затем переходите к предыдущим предложениям.

Что касается размещения столбцов
Вы всегда можете изменить порядок столбцов

d1 = df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
    {'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})

d1[df.columns]

Or

d1 = df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
    {'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})

d1.reindex_axis(df.columns, 1)
person piRSquared    schedule 14.06.2017
comment
@priRSquared большое спасибо за столь быстрый ответ. Это сработало, как вы показали, я проголосую за полный ответ, однако я забыл уточнить в исходном вопросе, что мне нужно суммировать оба значения и показать их в новом df. Также мне нужно показать классификационный код (у компании всегда будет классификационный код). Еще раз большое спасибо. - person ls101; 15.06.2017
comment
Нет проблем, если бы вы могли отредактировать свой вопрос, включив в него ожидаемый результат, я могу точно показать вам, как его получить. - person piRSquared; 15.06.2017
comment
Я только что отредактировал вопрос с желаемым результатом - еще раз спасибо - person ls101; 15.06.2017
comment
Две последние части (я поддержу ваш ответ за эту помощь), с которыми мне нужна помощь. 1) Похоже, что «Классификация» печатается/экспортируется в последний столбец, а не в 1-й. 2) Для обоих этих вариантов числа «Значение» на самом деле не суммируются, кажется, что они объединяются, может ли это означать, что мои значения не являются целыми? - person ls101; 15.06.2017
comment
Это сработало идеально, еще раз спасибо! Я собираюсь отметить этот вопрос как ответ. Поскольку вы так много знаете, у меня есть еще один вопрос. При создании моего окончательного df (показанного выше) я использую параметр «Value1» > 0 в предыдущем df, однако отрицательные значения все еще вставляются. Вы знаете, почему это может быть? Еще раз спасибо, помечаю вопрос как отвеченный, но я подумал, что просто спрошу. - person ls101; 15.06.2017
comment
@ ls101 Когда вы говорите, что использовали параметр 'Value 1' > 0... это слишком двусмысленно. Было бы лучше задать новый вопрос, где вы можете уточнить, что именно вы имеете в виду. - person piRSquared; 15.06.2017
comment
вот ссылка на новый вопрос, который я задал, если у вас есть минутка. stackoverflow.com/questions/44556966/ - person ls101; 15.06.2017