Apa cara terbaik untuk melakukan groupby pada Panda dataframe, tetapi mengecualikan beberapa kolom dari yang groupby? misalnya saya memiliki berikut dataframe:
tidak ada Kode Negara Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963 2 Afghanistan 15 Gandum 5312 Ha 10 20 30 2 Afghanistan 25 Jagung 5312 Ha 10 20 30 4 Angola 15 Gandum 7312 Ha 30 40 50 4 Angola 25 Jagung 7312 Ha 30 40 50
Saya ingin groupby kolom Negara dan Item_Code dan hanya menghitung jumlah baris yang jatuh di bawah kolom Y1961, Y1962 dan Y1963. Yang dihasilkan dataframe harus terlihat seperti ini:
tidak ada Kode Negara 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 hal ini menambah nilai dalam Item_Code kolom juga. Apakah ada cara saya dapat menentukan kolom mana yang akan disertakan dalam jumlah ' ()
operasi dan mana yang untuk mengecualikan?
Anda dapat memilih kolom dari groupby:
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
Perhatikan bahwa daftar lulus harus subset dari kolom jika tidak, anda'll melihat KeyError.
The agg
fungsi akan melakukan ini untuk anda. Melewati kolom dan fungsi sebagai dict dengan kolom, output:
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 group by kolom, dan ditentukan agregat kolom. Dalam contoh ini saya termasuk dua agg fungsi diterapkan untuk 'Y1962'.
Untuk mendapatkan apa yang anda harapkan untuk melihat, termasuk kolom lain dalam grup, dan menerapkan jumlah ke variabel Y dalam rangka:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
Jika anda sedang mencari lebih banyak cara umum untuk diterapkan ke banyak kolom, apa yang dapat anda lakukan adalah untuk membangun sebuah daftar dari nama-nama kolom dan lulus sebagai indeks yang dikelompokkan dataframe. Dalam kasus anda, misalnya:
columns = ['Y'+str(i) for year in range(1967, 2011)]
df.groupby('Country')[columns].agg('sum')