Python Pandas Group Dataframe по колона / Сума Цяло число Колона по колона на низ

Бях заседнал цял ден и прегледах множество статии за 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) И за двете от тези опции числата „Стойност“ всъщност не се сумират, изглежда, че се конкатенират, може ли това да означава, че стойностите ми не са int? - 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