اذهب إلى المحتوى
  • 0

حساب النسبة المئوية في pandas

Mohamed Elnemr

السؤال

أقوم بانشاء بيانات تحتوى على بعض المدن والمكاتب وكذلك مبيعات تلك المكاتب في المدن كالتالي:

df = pd.DataFrame({'city': ['Cairo', 'Dohha', 'Riyadh', 'Dubai'] * 3,
                   'office_id': range(1, 7) * 2,
                   'sales': [np.random.randint(100000, 999999)
                             for _ in range(12)]})

df.groupby(['city', 'office_id']).agg({'sales': 'sum'})

بحيث تظهر على الشكل التالي:

                  
city   office_id     sales   
Cairo     2          839507
          4          373917
          6          347225
Dohha     1          798585
          3          890850
          5          454423
Riyadh    1          819975
          3          202969
          5          614011
Dubai     2          163942
          4          369858
          6          959285

أريد حساب النسبة المئوية لمبيعات كل مكتب في كل مدينة علما أن محصلة المبيعات لكل المكاتب في كل مدينة = 100%

كيف يمكنني فعل هذا؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

يمكنك حساب النسبة المئوية بسهولة عن طريق عمل groupby لكل المكاتب وقسمتها على المبيعات كالتالي:

import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame({'city': ['Cairo', 'Dohha', 'Riyadh', 'Dubai'] * 3,
                   'office_id': range(1, 7) * 2,
                   'sales': [np.random.randint(100000, 999999)
                             for _ in range(12)]})

state_office = df.groupby(['city', 'office_id']).agg({'sales': 'sum'})

percent = state_office.groupby(level=0).apply(lambda x:
                                                 100 * x / float(x.sum()))

وتظهر النتيجة بالشكل الأتي:

                     
city  office_id        sales   
Cairo     2          16.981365
          4          19.250033
          6          63.768601
Dohha     1          19.331879
          3          33.858747
          5          46.809373
Riyadh    1          36.851857
          3          19.874290
          5          43.273852
Dubai     2          34.707233
          4          35.511259
          6          29.781508

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك فعل ذلك باستخدام التحويل transformation, ربما يكون الحل الأسهل والأسرع حيث يمكنك فعل ذلك باستخدام سطر واحد فقط كالتالي

df['%'] = 100 * df['sales'] / df.groupby('city')['sales'].transform('sum')

لو أردت طباعة النتيجة

print(df.sort_values(['city', 'office_id']).reset_index(drop=True))

      city     office_id     sales         %
0     Cairo       2         195197      9.844309
1     Cairo       4         877890      44.274352
2     Cairo       6         909754      45.881339
3     Dohha       1         614752      50.415708
4     Dohha       3         395340      32.421767
5     Dohha       5         209274      17.162525
6     Riyadh      1         549430      42.659629
7     Riyadh      3         457514      35.522956
8     Riyadh      5         280995      21.817415
9     Dubai       2         828238      35.696929
10    Dubai       4         719366      31.004563
11    Dubai       6         772590      33.298509

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

تابع معي:

import numpy as np
import pandas as pd
np.random.seed(0)
# بدايةً نقوم بتعريف الداتافريم بشكل صحيح لأنه كان يحتوي بعض الأخطاء
df = pd.DataFrame({'city': ['Cairo', 'Dohha', 'Riyadh', 'Dubai'] * 3,
                   'office_id':[x*2 for x in range(1, 7)]*2 ,
                   'sales': [np.random.randint(100000, 999999) for _ in range(12)]})
df
"""
    city 	office_id 	sales
0 	Cairo 	2 	    405711
1 	Dohha 	4     	535829
2 	Riyadh 	6     	217952
3 	Dubai 	8     	252315
4 	Cairo 	10    	982371
5 	Dohha 	12    	459783
6 	Riyadh 	2     	404137
7 	Dubai 	4     	222579
8 	Cairo 	6     	710581
9 	Dohha 	8     	548242
10 	Riyadh 	10 	    474564
11 	Dubai 	12 	    835831
"""
#office_id و city نطبق عملية التجميع على أساس العمود
# نحصل الآن على المدن مع كل المكاتب الموجودة فيها مع مبيعات كل مكتب
city_office = df.groupby(['city', 'office_id']).agg({'sales': 'sum'})
city_office
"""
             sales
city 	office_id 	
Cairo 	2 	405711
        6 	710581
        10 	982371
Dohha 	4 	535829
        8 	548242
        12 	459783
Dubai 	4 	222579
        8 	252315
        12 	835831
Riyadh 	2 	404137
        6 	217952
        10 	474564
"""
# لكننا نريد حساب النسبة المئوية لمبيعات كل مكتب  ضمن مدينة معينة أي  يجب أن نحسب  النسبة مقارنةً بباقي مبيعات المكاتب ضمن المدينة
# بذا يجب علينا إنشاء داتافريم آخر ليحسب لنا مجموع مبيعات كل المكاتب ضمن كل مدينة
# الآن ننظم  مبيعات كل مكتب 
City = df.groupby(['city']).agg({'sales': 'sum'})
City
"""
          sales
city 	
Cairo 	2098663   405711+710581+982371
Dohha 	1543854
Dubai 	1310725
Riyadh 	1096653
"""
#city على القيمة المقابلة له من جدول  sales الآن نعود للداتافريم السابق ونقوم بقسمة كل قيمة  في عمود ال 
# وبالتالي نحصل على النسبة المطلوبة
# نحتاج فقط لاستخدام للقسمة والضرب ب100 في عمود المبيعات
city_office.div(City, level='city') * 100
"""
            sales
city 	office_id 	
Cairo 	2 	19.331879   = (405711/2098663)*100
        6 	33.858747
        10 	46.809373
Dohha 	4 	34.707233
        8 	35.511259
        12 	29.781508
Dubai 	4 	16.981365
        8 	19.250033
        12 	63.768601
Riyadh 	2 	36.851857
        6 	19.874290
        10 	43.273852
"""

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...