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'?

Nilani Algiriyage
sumber
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
waitingkuo
sumber
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
Andy Hayden
sumber
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

Adakron Gr8
sumber
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.

Ted Petrou
sumber
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)

Tom
sumber
-2

Anda bisa menggunakan hitungan fungsi bawaan diikuti oleh fungsi grup oleh

df.groupby(['col5','col2']).count()
seansio1995
sumber