Hva er den beste måten å gjøre en groupby på en Pandas-dataramme, men ekskludere noen kolonner fra den groupby? f.eks. har jeg følgende dataramme:
Kode Land Vare_kode Vare Ele_kode Enhet Y1961 Y1962 Y1963
2 Afghanistan 15 Hvete 5312 Ha 10 20 30
2 Afghanistan 25 Mais 5312 Ha 10 20 30
4 Angola 15 Hvete 7312 Ha 30 40 50
4 Angola 25 Majs 7312 Ha 30 40 50
Jeg ønsker å gruppere etter kolonnene Country og Item_Code og kun beregne summen av radene som faller inn under kolonnene Y1961, Y1962 og Y1963. Den resulterende datarammen skal se slik ut:
Kode Land Vare_Code Vare Ele_Code Enhet Y1961 Y1962 Y1963
2 Afghanistan 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
Akkurat nå gjør jeg dette:
df.groupby('Country').sum()
Dette legger imidlertid også til verdiene i Item_Code-kolonnen. Kan jeg på noen måte spesifisere hvilke kolonner som skal inkluderes i sum()
-operasjonen og hvilke som skal ekskluderes?
Du kan velge kolonnene i en gruppering:
In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
Y1961 Y1962 Y1963
Country Item_Code
Afghanistan 15 10 20 30
25 10 20 30
Angola 15 30 40 50
25 30 40 50
*Vær oppmerksom på at listen som overføres, må være en delmengde av kolonnene, ellers får du opp en KeyError.
Funksjonen agg
gjør dette for deg. Overfør kolonnene og funksjonen som en dict med kolonne, utdata:
df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]}) # Added example for two output columns from a single input column
Dette viser bare gruppe etter-kolonnene og de angitte aggregerte kolonnene. I dette eksemplet har jeg inkludert to agg-funksjoner som brukes på 'Y1962'.
For å få akkurat det du håpet å se, kan du inkludere de andre kolonnene i gruppe etter og bruke summer på Y-variablene i rammen:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
Hvis du er på utkikk etter en mer generell måte å søke på mange kolonner, kan du lage en liste med kolonnenavn og angi den som indeks for den grupperte datarammen. I ditt tilfelle, for eksempel:
columns = ['Y'+str(i) for year in range(1967, 2011)]
df.groupby('Country')[columns].agg('sum')