Kelompokkan dengan agregasi dalam panda



Agregasi adalah salah satu operasi yang paling umum dalam analisis data. Berbagai teknologi menawarkan banyak cara untuk secara efektif mengelompokkan dan mengagregasi bidang-bidang yang menarik bagi kami (kolom, atribut). Artikel ini akan membahas tentang penerapan agregasi dalam panda.
Dalam spesialisasi saya, saya bekerja sangat sedikit dengan python, tetapi saya sering mendengar tentang kelebihan dan kekuatan dari bahasa ini, terutama ketika harus bekerja dengan data. Oleh karena itu, saya akan menggambar di sini operasi paralel dengan T-SQL dan memberikan beberapa contoh kode. Sebagai data yang saya akan gunakan mungkin set data paling populer - Iris Fisher .

Hal pertama yang terlintas dalam pikiran adalah untuk mendapatkan nilai maksimum, minimum atau rata-rata untuk setiap parameter iris dan dikelompokkan berdasarkan spesies tanaman ini, yang dalam python menggunakan panda akan terlihat seperti ini:

import pandas as pd

df = pd.read_csv('iris.csv', delimiter = ',')
print(df.groupby('variety').max()[['sepalLength']].to_markdown())

Hasil:

| variasi | sepal.length |
|: ----------- | ---------------: |
| Setosa | 5.8 |
| Versicolor | 7 |
| Virginica | 7.9 |

Atau lebih:

import pandas as pd
df = pd.read_csv('iris.csv', delimiter = ',')

print(df.groupby('variety').sepalLength.agg(
    maxSepalLength  = 'max',
    minSepalLength  = 'min',
    ).to_markdown())

Hasil:

| variasi | maxSepalLength | minSepalLength |
|: ----------- | -----------------: | ----------------- : |
| Setosa | 5.8 | 4.3 |
| Versicolor | 7 | 4.9 |
| Virginica | 7.9 | 4.9 |

Atau menggunakan ekspresi lambda:

import pandas as pd
df = pd.read_csv('iris.csv', delimiter = ',')

print(df.groupby('variety').sepalLength.agg([
    lambda x: x.max(), 
    lambda x: x.min()
    ]).to_markdown())

Hasil:

| variasi | <lambda_0> | <lambda_1> |
|: ----------- | -------------: | -------------: |
| Setosa | 5.8 | 4.3 |
| Versicolor | 7 | 4.9 |
| Virginica | 7.9 | 4.9 |

Fungsi Instance DataFrame
to_markdown()
memungkinkan Anda untuk menampilkan tabel (DataFrame) dalam bentuk (konsol) biasa.

Pada T-SQL, operasi ini terlihat seperti ini:

select i.Variety, max(i.SepalLength) as maxSepalLength
    from Iris i
        group by i.Variety

Hasil:

Setosa 5.8
Versicolor 7.0
Virginica 7.9

Tapi anggaplah sekarang kita ingin mendapatkan nilai maksimum dan minimum (jika Anda suka rata-rata) untuk semua parameter iris, secara alami untuk setiap jenis tanaman, kode T-SQL telah dihasilkan di sini:

select
	i.Variety 
	,max(i.SepalLength) as maxSepalLength 
	,min(i.SepalLength) as minSepalLength
	,max(i.SepalWidth) as maxSepalWidth
	,min(i.SepalWidth) as minSepalWidth
	,max(i.PetalLength) as maxPetalLength
	,min(i.PetalLength) as mibPetalLength
	,max(i.PetalWidth) as maxPetalWidth
	,min(i.PetalWidth) as minPetalWidth
from Iris i
	group by i.Variety

Hasil:

Setosa 5.8 4.3 4.4 2.3 1.9 1.0 0.6 0.1
Versicolor 7.0 4.9 3.4 2.0 5.1 3.0 1.8 1.0
Virginica 7.9 4.9 3.8 2.2 6.9 4.5 2.5 1.4

Dalam panda, kemungkinan agregasi kelompok hanya muncul dalam versi 0.25.0 tanggal 18 Juli 2019 (apa yang dilakukan sebelumnya) ?) dan ada beberapa variasi, pertimbangkan:

import pandas as pd
df = pd.read_csv('iris.csv', delimiter = ',')

df.groupby('variety').agg(
    maxSepalLength = pd.NamedAgg(column = 'sepalLength', aggfunc = 'max'),
    minSepalLength = pd.NamedAgg(column = 'sepalLength', aggfunc = 'min'),
    maxSepalWidth = pd.NamedAgg(column = 'sepalWidth', aggfunc = 'max'),
    minSepalWidth = pd.NamedAgg(column = 'sepalWidth', aggfunc = 'min'),
    maxPetalLength = pd.NamedAgg(column = 'petalLength', aggfunc = 'max'),
    minPetalLength = pd.NamedAgg(column = 'petalLength', aggfunc = 'min'),
    maxPetalWidth = pd.NamedAgg(column = 'petalWidth', aggfunc = 'max'),
    minPetalWidth = pd.NamedAgg(column = 'petalWidth', aggfunc = 'min'),
    )

Hasil:

Setosa 5.8 4.3 4.4 2.3 1.9 1.0 0.6 0.1
Versicolor 7.0 4.9 3.4 2.0 5.1 3.0 1.8 1.0
Virginica 7.9 4.9 3.8 2.2 6.9 4.5 2.5 1.4

Fungsi
DataFrame.agg(self, func, axis=0, *args, **kwargs)

memungkinkan agregasi beberapa operasi pada sumbu yang diberikan. Sebagai parameter, fungsi menerima ** kwargs (dinamai argumen, lihat artikel di habr untuk detail ), yang merupakan kolom di mana operasi dilakukan dan nama fungsi agregasi dalam tanda kutip tunggal. Rekaman terlihat cukup produktif. Berpindah.

Solusi yang sama menggunakan ekspresi lambda terlihat jauh lebih ringkas dan sederhana:

import pandas as pd
df = pd.read_csv('iris.csv', delimiter = ',')

df.groupby('variety').agg([
    lambda x: x.max(),
    lambda x: x.min()
    ])

Hasil:

Setosa 5.8 4.3 4.4 2.3 1.9 1.0 0.6 0.1
Versicolor 7.0 4.9 3.4 2.0 5.1 3.0 1.8 1.0
Virginica 7.9 4.9 3.8 2.2 6.9 4.5 2.5 1.4

Saya sering mendengar tentang jauh lebih sedikit ditulis ketika Python ketika memecahkan jenis masalah yang sama dibandingkan dengan bahasa lain. Di sini, dibandingkan dengan T-SQL, orang bisa setuju dengan ini, tetapi kejelasan dan urutan ekspresi alat linguistik seperti SQL atau T-SQL benar-benar hilang (pendapat pribadi).

Kumpulan data dan kode dari artikel dapat ditemukan di sini.

Apa yang baru di 0.25.0 (18 Juli 2019)

panda

All Articles