Jaki jest najlepszy sposób wykonania grupowania w ramce danych Pandas, ale wykluczyć niektóre kolumny z tej grupy? np. mam następującą ramkę danych:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 Wheat 5312 Ha 10 20 30
2 Afghanistan 25 Maize 5312 Ha 10 20 30
4 Angola 15 Wheat 7312 Ha 30 40 50
4 Angola 25 Maize 7312 Ha 30 40 50
Chcę pogrupować według kolumn Country i Item_Code i obliczyć tylko sumę wierszy należących do kolumn Y1961, Y1962 i Y1963. Wynikowa ramka danych powinna wyglądać następująco:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
Teraz robię to:
df.groupby('Country').sum()
Jednak sumuje to również wartości w kolumnie Item_Code. Czy istnieje sposób, w jaki mogę określić, które kolumny należy uwzględnić w sum()
operacji, a które wykluczyć?
listColumns = list(df.columns)
a następnie usuwasz kolumny, których nie chcesz,listColumns.remove('Y1964')
i na koniec wykonaj podsumowanie:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
cannot reindex from a duplicate axis
agg
Funkcja zrobi to za Ciebie. Przekaż kolumny i działaj jako dykt z kolumną, wyjście: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
Spowoduje to wyświetlenie tylko grupy według kolumn i określonych kolumn zagregowanych. W tym przykładzie zawarłem dwie funkcje agowe zastosowane do „Y1962”.
Aby uzyskać dokładnie to, co chciałeś zobaczyć, uwzględnij inne kolumny w grupie według i zastosuj sumy do zmiennych Y w ramce:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
źródło
Jeśli szukasz bardziej uogólnionego sposobu zastosowania do wielu kolumn, możesz utworzyć listę nazw kolumn i przekazać ją jako indeks zgrupowanej ramki danych. W Twoim przypadku na przykład:
columns = ['Y'+str(i) for year in range(1967, 2011)] df.groupby('Country')[columns].agg('sum')
źródło