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

السؤال

نشر

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

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...