Pandalar DataFrame Grubu


166

Aşağıdaki biçimde bir panda veri çerçevesi var:

df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['x/y/z','x/y','x/y/z/n','x/u','x','x/u/v','x/y/z','x','x/u/v/b','-','x/y','x/y/z','x','x/u/v/w'],['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
df.columns = ['col1','col2','col3','col4','col5']

df:

   col1 col2 col3     col4 col5
0   1.1    A  1.1    x/y/z    1
1   1.1    A  1.7      x/y    3
2   1.1    A  2.5  x/y/z/n    3
3   2.6    B  2.6      x/u    2
4   2.5    B  3.3        x    4
5   3.4    B  3.8    x/u/v    2
6   2.6    B    4    x/y/z    5
7   2.6    A  4.2        x    3
8   3.4    B  4.3  x/u/v/b    6
9   3.4    C  4.5        -    3
10  2.6    B  4.6      x/y    5
11  1.1    D  4.7    x/y/z    1
12  1.1    D  4.7        x    1
13  3.3    D  4.8  x/u/v/w    1

Şimdi bunu aşağıdaki gibi iki sütuna göre gruplandırmak istiyorum:

df.groupby(['col5','col2']).reset_index()

Çıktı:

             index col1 col2 col3     col4 col5
col5 col2                                      
1    A    0      0  1.1    A  1.1    x/y/z    1
     D    0     11  1.1    D  4.7    x/y/z    1
          1     12  1.1    D  4.7        x    1
          2     13  3.3    D  4.8  x/u/v/w    1
2    B    0      3  2.6    B  2.6      x/u    2
          1      5  3.4    B  3.8    x/u/v    2
3    A    0      1  1.1    A  1.7      x/y    3
          1      2  1.1    A  2.5  x/y/z/n    3
          2      7  2.6    A  4.2        x    3
     C    0      9  3.4    C  4.5        -    3
4    B    0      4  2.5    B  3.3        x    4
5    B    0      6  2.6    B    4    x/y/z    5
          1     10  2.6    B  4.6      x/y    5
6    B    0      8  3.4    B  4.3  x/u/v/b    6

Sayımı aşağıdaki gibi her satırdan almak istiyorum. Beklenen çıktı:

col5 col2 count
1    A      1
     D      3
2    B      2
etc...

Beklenen çıktımı nasıl alabilirim? Ve her 'col2' değeri için en büyük sayıyı bulmak istiyorum?


Dün çok benzer bir soru geldi .. buraya bakın .
bdiamante

Yanıtlar:


116

@ Andy'nin cevabını takiben, ikinci sorunuzu çözmek için aşağıdakileri yapabilirsiniz:

In [56]: df.groupby(['col5','col2']).size().reset_index().groupby('col2')[[0]].max()
Out[56]: 
      0
col2   
A     3
B     2
C     1
D     3

1
Bunun için C ... 1 ... 3 gibi "col5" değerleri alabilir miyim?
Nilani Algiriyage

141

Şunu arıyorsunuz size:

In [11]: df.groupby(['col5', 'col2']).size()
Out[11]:
col5  col2
1     A       1
      D       3
2     B       2
3     A       3
      C       1
4     B       1
5     B       2
6     B       1
dtype: int64

Waitkuo ("ikinci soru") ile aynı cevabı almak, ama biraz daha temiz, seviyeye göre gruplandırmak:

In [12]: df.groupby(['col5', 'col2']).size().groupby(level=1).max()
Out[12]:
col2
A       3
B       2
C       1
D       3
dtype: int64

1
Bilmiyorum Neden bunu unuttum: O, herhangi bir şekilde ikinci sorum? Her "col2" değeri için en büyük sayımı bulmak ve karşılık gelen "col5" değeri olsun?
Nilani Algiriyage

23

Panda panosu veri çerçevesine veri ekleme ve sütun adı sağlama .

import pandas as pd
df = pd.DataFrame([['A','C','A','B','C','A','B','B','A','A'], ['ONE','TWO','ONE','ONE','ONE','TWO','ONE','TWO','ONE','THREE']]).T
df.columns = [['Alphabet','Words']]
print(df)   #printing dataframe.

Basılı verilerimiz:

resim açıklamasını buraya girin

Bir yapmak için pandalar ve sayacında dataframe grup ,
Sen, gruplama sayar Bir sütunu daha sağlamanız gerekir çağrısını olarak bu sütun izin "TEZGAH" dataframe içinde .

Bunun gibi:

df['COUNTER'] =1       #initially, set that counter to 1.
group_data = df.groupby(['Alphabet','Words'])['COUNTER'].sum() #sum function
print(group_data)

ÇIKTI:

resim açıklamasını buraya girin


9
Alfabe sütununu (örneğin A) aşağıda tekrar etmesini ve ilk sütundaki boşlukları nasıl bırakmamasını nasıl sağlayabilirim?
18:54, blissweb

alfabe ve kelimeye göre toplanan her grubun değerine nasıl erişilir?
Rahul Goyal

21

Sadece tek bir grup kullanan deyimsel çözüm

(df.groupby(['col5', 'col2']).size() 
   .sort_values(ascending=False) 
   .reset_index(name='count') 
   .drop_duplicates(subset='col2'))

  col5 col2  count
0    3    A      3
1    1    D      3
2    5    B      2
6    3    C      1

açıklama

GroupBy sonucu sizeyöntemi ile bir Serisi olduğunu col5ve col2endekste. Buradan, içindeki her bir değerin maksimum değerini bulmak için başka bir groupby yöntemi kullanabilirsiniz, col2ancak yapılması gerekmez. Sadece sıralama tüm değerler descendingly ve sonra ilk geçtiği ile satırları tutabilir col2ile drop_duplicatesyöntemle.


Denilen hiçbir param yoktur nameiçinde reset_index()pandalar geçerli sürümünde: pandas.pydata.org/pandas-docs/stable/generated/...
mmBs


Tamam, benim hatam. Ben DataFramedeğil çalışırken kullandım Series. Bağlantı için teşekkürler.
mmBs

2

Veri çerçevesine grupların sayılarını içeren yeni bir sütun ('count_column' diyelim) eklemek isterseniz:

df.count_column=df.groupby(['col5','col2']).col5.transform('count')

(Nan içermediğinden 'col5'i seçtim)


-2

Sadece dahili fonksiyon sayısını ve ardından groupby fonksiyonunu kullanabilirsiniz.

df.groupby(['col5','col2']).count()
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.