Mohamed Elnemr نشر 8 سبتمبر 2021 أرسل تقرير نشر 8 سبتمبر 2021 أقوم بانشاء بيانات تحتوى على بعض المدن والمكاتب وكذلك مبيعات تلك المكاتب في المدن كالتالي: 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% كيف يمكنني فعل هذا؟ 2 اقتباس
0 Ahmed Sharshar نشر 8 سبتمبر 2021 أرسل تقرير نشر 8 سبتمبر 2021 يمكنك حساب النسبة المئوية بسهولة عن طريق عمل 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 محمد أبو عواد نشر 8 سبتمبر 2021 أرسل تقرير نشر 8 سبتمبر 2021 يمكنك فعل ذلك باستخدام التحويل 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 1 اقتباس
0 Ali Haidar Ahmad نشر 8 سبتمبر 2021 أرسل تقرير نشر 8 سبتمبر 2021 تابع معي: 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 """ 1 اقتباس
السؤال
Mohamed Elnemr
أقوم بانشاء بيانات تحتوى على بعض المدن والمكاتب وكذلك مبيعات تلك المكاتب في المدن كالتالي:
بحيث تظهر على الشكل التالي:
أريد حساب النسبة المئوية لمبيعات كل مكتب في كل مدينة علما أن محصلة المبيعات لكل المكاتب في كل مدينة = 100%
كيف يمكنني فعل هذا؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.