Apa cara terbaik untuk melakukan groupby pada dataframe Pandas, tapi mengecualikan beberapa kolom dari groupby itu? misalnya saya memiliki dataframe berikut:
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
Saya ingin mengelompokkan berdasarkan kolom Country dan Item_Code dan hanya menghitung jumlah baris yang berada di bawah kolom Y1961, Y1962 dan Y1963. Dataframe yang dihasilkan akan terlihat seperti ini:
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
Sekarang saya melakukan ini:
df.groupby('Country').sum()
Namun ini menambahkan nilai di kolom Item_Code juga. Adakah cara untuk menentukan kolom mana yang akan disertakan dalam sum()
operasi dan mana yang akan dikecualikan?
listColumns = list(df.columns)
kemudian Anda menghapus kolom yang tidak Anda inginkan,listColumns.remove('Y1964')
dan akhirnya lakukan penjumlahan Anda:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
cannot reindex from a duplicate axis
The
agg
fungsi akan melakukan ini untuk Anda. Teruskan kolom dan fungsi sebagai dikt dengan kolom, keluaran: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
Ini hanya akan menampilkan grup menurut kolom, dan kolom agregat yang ditentukan. Dalam contoh ini saya menyertakan dua fungsi agg yang diterapkan ke 'Y1962'.
Untuk mendapatkan apa yang Anda harapkan untuk dilihat, sertakan kolom lain di grup dengan, dan terapkan jumlah ke variabel Y dalam bingkai:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
sumber
Jika Anda mencari cara yang lebih umum untuk diterapkan ke banyak kolom, yang dapat Anda lakukan adalah membuat daftar nama kolom dan meneruskannya sebagai indeks kerangka data yang dikelompokkan. Dalam kasus Anda, misalnya:
columns = ['Y'+str(i) for year in range(1967, 2011)] df.groupby('Country')[columns].agg('sum')
sumber