Pandas groupby ile toplar, ancak belirli sütunları hariç tutar

Pandas veri çerçevesi üzerinde bir groupby yapmanın, ancak bazı sütunları bu groupby'den hariç tutmanın en iyi yolu nedir? ör. aşağıdaki veri çerçevesine sahibim:

Kod Ülke Ürün_Kodu Ürün Ele_Kodu Birim Y1961 Y1962 Y1963
2 Afganistan 15 Buğday 5312 Ha 10 20 30
2 Afganistan 25 Mısır 5312 Ha 10 20 30
4 Angola 15 Buğday 7312 Ha 30 40 50
4 Angola 25 Mısır 7312 Ha 30 40 50

Country ve Item_Code sütunlarına göre gruplama yapmak ve yalnızca Y1961, Y1962 ve Y1963 sütunlarının altına düşen satırların toplamını hesaplamak istiyorum. Elde edilen veri çerçevesi aşağıdaki gibi görünmelidir:

Kod Ülke Ürün_Kodu Ürün Ele_Kodu Birim Y1961 Y1962 Y1963
2 Afganistan 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100

Şu anda bunu yapıyorum:

df.groupby('Country').sum()

Ancak bu, Item_Code sütunundaki değerleri de toplar. Hangi sütunların sum() işlemine dahil edileceğini ve hangilerinin hariç tutulacağını belirtmenin herhangi bir yolu var mı?

Çözüm

Bir groupby'nin sütunlarını seçebilirsiniz:

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

Aktarılan listenin sütunların bir alt kümesi olması gerektiğini unutmayın, aksi takdirde bir KeyError görürsünüz.

Yorumlar (12)

agg` fonksiyonu bunu sizin için yapacaktır. Sütunları ve işlevi sütun, çıktı ile bir dict olarak iletin:

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

Bu, yalnızca group by sütunlarını ve belirtilen aggregate sütunlarını görüntüleyecektir. Bu örnekte, 'Y1962' öğesine uygulanan iki agg işlevini dahil ettim.

Tam olarak görmeyi umduğunuz şeyi elde etmek için, diğer sütunları gruba dahil edin ve çerçevedeki Y değişkenlerine toplamları uygulayın:

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
Yorumlar (2)

Birçok sütuna uygulamak için daha genel bir yol arıyorsanız, yapabileceğiniz şey sütun adlarının bir listesini oluşturmak ve bunu gruplandırılmış veri çerçevesinin indeksi olarak geçmektir. Sizin durumunuzda, örneğin:

columns = ['Y'+str(i) for year in range(1967, 2011)]

df.groupby('Country')[columns].agg('sum')
Yorumlar (0)