Pandalar grup bazında toplanır, ancak belirli sütunları hariç tutar


89

Pandas veri çerçevesinde bir groupby yapmanın, ancak bu groupby'den bazı sütunları hariç tutmanın en iyi yolu nedir? Örneğin, aşağıdaki veri çerçevesine sahibim:

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

Ülke ve Öğe_Kodu sütununa göre gruplamak ve yalnızca Y1961, Y1962 ve Y1963 sütunlarının altındaki satırların toplamını hesaplamak istiyorum. Elde edilen veri çerçevesi şu şekilde görünmelidir:

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

Şu anda bunu yapıyorum:

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

Ancak bu, Item_Code sütunundaki değerleri de ekler. sum()İşleme hangi sütunların dahil edileceğini ve hangilerinin hariç tutulacağını belirlememin bir yolu var mı ?

Yanıtlar:


120

Bir grubun sütunlarını şu şekilde 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, aksi takdirde bir KeyError göreceksiniz.


1
Her ülke ve öğe kodu için kayıt sayısını başka bir sütun olarak nasıl dahil edebilirim?
Sushant Kulkarni

Sadece 1'i içeren şekilde gruplamadan önce bir kukla sütun oluşturabilirsiniz. Daha sonra toplam, bir sayım oluşturarak bunları toplayacaktır.
Matt W.

Sadece bir veya iki sütunu hariç tutmak istiyorsanız, o zaman tüm sütun adlarını olduğu gibi alırsınız, ardından istemediğiniz sütunları listColumns = list(df.columns)kaldırırsınız listColumns.remove('Y1964')ve sonunda özetinizi yaparsınız:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
Roberto Stelling

Çok teşekkürler. Grubu çalıştırabilirim, ama seçim kısmını değil. Girdiğim sütunların listesi veri çerçevesi arasında, ancak ValueError'ı yükseltmeye devam ediyor:cannot reindex from a duplicate axis
Bowen Liu

@BowenLiu aynı ada sahip birden fazla sütununuz varsa, bu hatayı gösterecektir. Bu durumda, istediğiniz sütunları elde etmek için iloc veya loc kullanmanız gerekecek, bence bunu groupby'den önce yapmanız gerekecek.
Andy Hayden

40

aggFonksiyon sizin için yapacaktır. Sütunları iletin ve sütun, çıktı ile bir dikt olarak işlev yapın:

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 grubu sütunlara göre ve belirtilen toplu sütunları görüntüler. Bu örnekte, 'Y1962'ye uygulanan iki agg işlevini dahil ettim.

Tam olarak görmeyi umduğunuz şeyi elde etmek için, gruba diğer sütunları 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})

1
teşekkürler, bu genelleştirilebilir mi? Y1961 biçiminde çok sayıda sütunum var ... bu yüzden şöyle bir liste oluşturuyorum: yrs = ['Y' + str (x) x aralığı (1961, 2010 + 1, 1)]. Çözümünüz agg içinde 'yrs' kullanabilir mi?
user308827

Bu fikri gerçekten beğendim. İşin püf noktası, değeri numpy sum işlevi olacak şekilde bu dikteyi inşa etmektir. Tersine, tek yapmak istediğiniz tüm kalan sütunları toplamaksa, orijinal-ish çözümünüz, sütunlara göre grupların tümü ifadeye göre grupta yer alıyorsa işe yarar.
leroyJr

11

Birçok sütuna uygulamak için daha genelleştirilmiş bir yol arıyorsanız, yapabileceğiniz şey, bir sütun adları listesi oluşturmak ve bunu gruplanmış veri çerçevesinin dizini olarak aktarmaktır. Sizin durumunuzda, örneğin:

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

df.groupby('Country')[columns].agg('sum')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.