Pandas DataFrame Group oleh dua kolom dan dapatkan jumlah


166

Saya memiliki kerangka data panda dalam format berikut:

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

Sekarang saya ingin mengelompokkan ini dengan dua kolom seperti berikut:

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

Keluaran:

             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

Saya ingin mendapatkan hitungan dengan setiap baris seperti berikut. Output yang Diharapkan:

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

Bagaimana cara mendapatkan hasil yang saya harapkan? Dan saya ingin mencari jumlah terbesar untuk setiap nilai 'col2'?


Pertanyaan yang sangat mirip baru saja muncul kemarin .. lihat di sini .
bdiamante

Jawaban:


116

Diikuti oleh jawaban @ Andy, Anda dapat melakukan hal berikut untuk menyelesaikan pertanyaan kedua:

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
Bisakah saya mendapatkan nilai "col5" untuk ini seperti C ... 1 ... 3?
Nilani Algiriyage

141

Anda mencari 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

Untuk mendapatkan jawaban yang sama dengan waitingkuo ("pertanyaan kedua"), tetapi sedikit lebih bersih, adalah dengan mengelompokkan berdasarkan level:

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
Saya tidak tahu Mengapa saya lupa ini: O, Bagaimana dengan pertanyaan kedua saya? Temukan jumlah terbesar untuk setiap nilai "col2" dan dapatkan nilai "col5" yang sesuai?
Nilani Algiriyage

23

Memasukkan data ke dalam kerangka data panda dan memberikan nama kolom .

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.

Ini adalah data cetak kami:

masukkan deskripsi gambar di sini

Untuk membuat grup kerangka data dalam panda dan penghitung ,
Anda perlu memberikan satu kolom lagi yang menghitung pengelompokan, sebut saja kolom itu sebagai, "COUNTER" dalam kerangka data .

Seperti ini:

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

KELUARAN:

masukkan deskripsi gambar di sini


9
Bagaimana saya bisa mendapatkan kolom alfabet (mis. A.) untuk mengulang di bawah ini dan tidak meninggalkan celah di kolom pertama ??
blissweb

bagaimana cara mengakses nilai masing-masing kelompok yang dijumlahkan berdasarkan alfabet dan kata?
Rahul Goyal

21

Solusi idiomatik yang hanya menggunakan satu grup oleh

(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

Penjelasan

Hasil dari sizemetode groupby adalah Seri dengan col5dan col2dalam indeks. Dari sini, Anda dapat menggunakan metode groupby lain untuk menemukan nilai maksimum dari setiap nilai col2tetapi tidak perlu dilakukan. Anda cukup mengurutkan semua nilai secara turun-temurun dan kemudian hanya menyimpan baris dengan kemunculan pertama col2dengan drop_duplicatesmetode.


Tidak ada param yang dipanggil namedalam reset_index()versi panda saat ini: pandas.pydata.org/pandas-docs/stable/generated/…
mmBs


Ok, salahku. Saya menggunakannya saat bekerja dengan DataFrametidak Series. Terima kasih untuk tautannya.
mmBs

2

Jika Anda ingin menambahkan kolom baru (misalnya 'count_column') yang berisi jumlah grup ke dalam kerangka data:

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

(Saya memilih 'col5' karena tidak mengandung nan)


-2

Anda bisa menggunakan hitungan fungsi bawaan diikuti oleh fungsi grup oleh

df.groupby(['col5','col2']).count()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.