تجميع Groupby في الباندا



يعتبر التجميع من أكثر العمليات شيوعًا في تحليل البيانات. تقدم لنا التقنيات المختلفة مجموعة من الطرق لتجميع وتجميع المجالات التي تهمنا بشكل فعال (الأعمدة والسمات). ستتحدث هذه المقالة عن تنفيذ التجميع في الباندا.
في تخصصي ، أعمل قليلًا جدًا مع python ، ولكن غالبًا ما أسمع عن إيجابيات وقوة هذه اللغة ، خاصة عندما يتعلق الأمر بالعمل مع البيانات. لذلك ، سأرسم هنا عملية متوازية مع T-SQL وأعطي بعض الأمثلة البرمجية. نظرًا لأن البيانات التي سأستخدمها ربما تكون مجموعة البيانات الأكثر شيوعًا - Irises Fisher .

أول شيء يتبادر إلى الذهن هو الحصول على القيمة القصوى أو الدنيا أو المتوسطة لأي من معلمات القزحية والمجموعة حسب أنواع هذا النبات ، والتي ستبدو في الثعبان باستخدام الباندا شيء مثل هذا:

import pandas as pd

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

النتيجة:

| متنوعة | sepal.length |
|: ----------- | ---------------: |
| سيتوسا | 5.8 |
| متعدد الألوان | 7 |
| فيرجينيا | 7.9 |

أو هكذا:

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

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

النتيجة:

| متنوعة | maxSepalLength | minSepalLength |
|: ----------- | -----------------: | ----------------- : |
| سيتوسا | 5.8 | 4.3 |
| متعدد الألوان | 7 | 4.9 |
| فيرجينيا | 7.9 | 4.9 |

أو باستخدام تعبيرات لامدا:

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())

النتيجة:

| متنوعة | <lambda_0> | <lambda_1> |
|: ----------- | -------------: | -------------: |
| سيتوسا | 5.8 | 4.3 |
| متعدد الألوان | 7 | 4.9 |
| فيرجينيا | 7.9 | 4.9 |

دالة مثيل DataFrame
to_markdown()
يسمح لك بعرض جدول (DataFrame) في نموذج (وحدة التحكم) المعتاد.

في T-SQL ، تبدو هذه العملية شيئًا مثل هذا:

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

النتيجة:

Setosa 5.8 Versicolor
7.0
Virginica 7.9

ولكن افترض الآن أننا نريد الحصول على كل من القيم القصوى والدنيا (إذا كنت تحب المتوسط) لجميع معلمات القزحية ، وبطبيعة الحال لكل نوع من النباتات ، تم إنشاء رمز T-SQL هنا:

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

النتيجة:

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

في الباندا ، ظهرت إمكانية تجميع المجموعة فقط في الإصدار 0.25.0 من 18 يوليو 2019 (ما تم فعله من قبل) ؟) وهناك العديد من الاختلافات ، اعتبرها:

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'),
    )

النتيجة:

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
فيرجينيا 7.9 4.9 3.8 2.2 6.9 4.5 2.5 1.4

الوظيفة
DataFrame.agg(self, func, axis=0, *args, **kwargs)

يسمح بتجميع العديد من العمليات على محور معين. تستلم الوظيفة ** kwargs (وسيطات مسماة ، انظر المقالة على habr للحصول على التفاصيل ) ، وهي عمود يتم تنفيذ العملية عليه واسم وظيفة التجميع في علامات الاقتباس المفردة كمعلمات . يبدو التسجيل ضخمًا جدًا. استمر.

الحل نفسه باستخدام تعبيرات لامدا يبدو أكثر اختصارًا وبساطة:

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

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

النتيجة:

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
فيرجينيكا 7.9 4.9 3.8 2.2 6.9 4.5 2.5 1.4

غالبًا ما أسمع عن كتابة أقل بكثير عند بايثون عند حل نفس النوع من المشاكل بالمقارنة مع اللغات الأخرى. هنا ، بالمقارنة مع T-SQL ، يمكن للمرء أن يتفق مع هذا ، ولكن وضوح وتسلسل تعبيرات الأدوات اللغوية مثل SQL أو T-SQL يتم فقدها تمامًا (رأي شخصي).

مجموعة البيانات ورمز من هذه المادة يمكن العثور عليها هنا

ما هو الجديد في 0.25.0 (18 يوليو 2019)

الباندا

All Articles