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

Ahmed Sharshar

الأعضاء
  • المساهمات

    348
  • تاريخ الانضمام

  • تاريخ آخر زيارة

إجابات الأسئلة

  1. إجابة Ahmed Sharshar سؤال في ما الفرق في استخدام IN و JOIN عند التعامل مع جداول بعدد كبير من الأسطر SQL كانت الإجابة المقبولة   
    في البداية لاحظ أن
    SELECT a.* FROM a JOIN b ON a.col = b.col ليست نفسها:
    SELECT a.* FROM a WHERE col IN ( SELECT col FROM b ) الا اذا b.col كان فريدا في كل حالة، لذا احذر عند استخدامها اذ قد يؤدوا الى نواتج مختلفة.
    اما اذا أردت شيئا يعطي نفس نتيجة الاستعلام الأول:
    SELECT a.* FROM a JOIN ( SELECT DISTINCT col FROM b ) ON b.col = a.col اما بالنسبة للأداء فإن join عادة ما تكون أسرع في التنفيذ، ليس بفارق كبير على أي حال، لكنها قد تكون أبطأ اذا كانت الجداول غير مفهرسة  non-indexed tables، لذا فان حتى السرعة قد تتوقف على كيفية استخدامك لها ونوع بياناتك.
  2. إجابة Ahmed Sharshar سؤال في أريد عمل جدول ناتج من دمج كل سطر من أول جدول مع كل السطور من الجدول الثاني في SQL كانت الإجابة المقبولة   
    يمكنك استخدام cross join والتي تقوم بعمل مزيج بين كل العناصر في الجدول الأول عناصر الجدول الثاني كما توضح الرسمة التالية:

    ويتم كتابتها بالشكل التالي:
    SELECT * FROM table1 CROSS JOIN table2; للتوضيح كمثال، دعنا ننشئ الجدول التالي:
    Player Department_id Goals Ahmed 1 2 Mohamed 2 2 Eyad 3 5 والجدول الثاني هكذا:
    Department_id Department_name 1 IT 2 HR 3 Marketing اذا قمنا بكتابة الكود لتالي لعمل cross بين الجدولين:
    SELECT * FROM MatchScore CROSS JOIN Departments يظهر لنا الجدول التالي:
    Player Department_id Goals Depatment_id Department_name Ahmed 1 2 1 IT mohamed 2 2 1 IT Eyad 3 5 1 IT Ahmed 1 2 2 HR mohamed 2 2 2 HR Eyad 3 5 2 HR Ahmed 1 2 3 Marketing mohamed 2 2 3 Marketing Eyad 3 5 3 Marketing لاحظ أنه قام بدمج كل عنصر في الجدول الأول بكل عنصر في الجدول الثاني
  3. إجابة Ahmed Sharshar سؤال في أيهما أفضل في التنفيذ INNER JOIN أو INNER JOIN (SELECT . FROM) كانت الإجابة المقبولة   
    الحالة المعروضة لن تفرق في الأداء كثيرا مهما كبر حجم البيانات وذلك لأن الأمر نفسه صغير. وبشكل عام فأن الأداء يعتمد على عدد الصفوف التي يتم العمل عليها وعدد الأعمدة التي تقوم بأرجاعها وهنا لا فرق بين الأثنين لذا لن تجد فرقا في الأداء.
    وهذا لان خطط الإستعلام لكلاهما واحدة، لذا فإن عدد الصفوف المتأثرة وعدد الأعمدة التي ترجع واحدة، وبشكل عام فأن الخادم sql server سيقوم بتحويلهم لنفس الصورة في النهاية فلا فرق.
    اما اذا كان الإستعلام يحتوى على بعض الحسابات أو التجميعات ( calculations, aggregations) فإن الطريقة الثانية أفضل بالتاكيد، اما هذة الحالة فلا لانه لا توجد حسابات أو تجميعات.
  4. إجابة Ahmed Sharshar سؤال في ما الفرق بين natural join و inner join في SQL؟ كانت الإجابة المقبولة   
    هناك فروق كثيرة بين الطريقتين، لكن بشكل أساسي، فان الفرق يتمثل فيه كيفية عمل كل منهما:
    Natural Join : تقوم باختيار الأعمدة بناء على التطابق في محتوى عمود مشترك بين الجداول التي يتم الاختيار بينها، بمعني انه يبحث عن عمود مشترك ويقوم باظهار كل الخصائص بدمج الأعمدة المراد دمجها بناء على تطابق هذا العمود المشترك، أنظر المثال التالي: تخيل أن هناك جدول للطلاب كالتالي:

    وجدول أخر للدرجات كالتالي:

    لاحظ وجود عمود مشترك Roll_No وبه أشخاص متطابقون في كلا الجدولين (2 و 3)، اذا قمنا بتشغيل هذا الأمر:
    SELECT * FROM Student NATURAL JOIN Marks; فسيقوم باختيار الأشخاص المشتركون في كلا الجدولين بناء على العمود Roll_No كالتالي:

    Inner Join : يقوم باختيار العناصر المتشابهة تمام مثلا Natural Join لكن يقوم بارجاع العمود المشترك مرة عن كل جدول، بمعني أخر أنه يقوم بوضع كل جدول بجانب الأخر بعد بحث التطابق بين الجدولين، في المثال السابق ، لو قمنا بتشغيل الأمر: SELECT * FROM student S INNER JOIN Marks M ON S.Roll_No = M.Roll_No; يكون الخرج على الشكل التالي:

     
  5. إجابة Ahmed Sharshar سؤال في حساب النسبة المئوية في pandas كانت الإجابة المقبولة   
    يمكنك حساب النسبة المئوية بسهولة عن طريق عمل 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  
  6. إجابة Ahmed Sharshar سؤال في ظهور الخطأ hashtable keyerror في pandas كانت الإجابة المقبولة   
    في البداية قمت بتحويل أسماء الأعمدة الي list وذلك للتأكد من كتابتها بطريقة صحيحة:
    print (df.columns.tolist()) وقد ظهر أن هناك بعض المسافات الزائدة في أسماء الأعمدة:
    print (df.columns.tolist()) ['Name', ' Date', ' review'] ^ ^ ويمكنك الاستغناء عن تلك المسافات بالكود التالي:
    new_df.columns = df.columns.str.strip() أو باستخدام الكود التالي اثناءء تحميل الملف:
    df = pd.read_csv("D:\\data.csv", skipinitialspace=True)  
  7. إجابة Ahmed Sharshar سؤال في ظهور الخطأ Error tokenizing data في pandas كانت الإجابة المقبولة   
    يظهر الخطأ نتيجة عدم معرفة ال parser برأس البيانات header حيث يعتبر أن أول صف هو بداية البيانات رغم أنه ليس كذلك، لذا يمكنك تجربة الكود التالي لتغطي هذا الخطأ والذي يقوم بعدم اعتبار أول صفين ضمن البيانات:
    data = pd.read_csv(path, skiprows=2) أو يمكنك ترك pandas تعالج الخطأ بنفسها عن طريق تجنب الصفوف التى تظهر الخطأ كالتالي:
    df = pd.read_csv('data.csv', error_bad_lines=False)
  8. إجابة Ahmed Sharshar سؤال في حساب عدد مرات تكرار عنصر داخل dataframe في pandas كانت الإجابة المقبولة   
    يمكنك ببساطة استخدام الدالة groupby ثم استخدام count لحساب عدد تكرار كل عنصر كالتالي:
    In [1]: df = pd.DataFrame({'a':list('abccbac')}) df.groupby('a').count() Out[1]: a c 3 a 2 a 2 أو مباشرة يمكنك استخدام value_counts() لعد عدد القيم كالتالي:
    In [2]: df['a'].value_counts() Out[2]: c 3 a 2 b 2 اما اذا أردت حساب قيمة تكرار كل عنصر بشكل مفرداً ووضعها في عمود للتكرارات يمكنك استخدام transform كالتالي:
    In [4]: df['freq'] = df.groupby('a')['a'].transform('count') df Out[4]: a freq 0 a 2 1 b 3 2 c 2 3 c 2 4 b 3 5 a 2 6 b 3  
  9. إجابة Ahmed Sharshar سؤال في تطبيق دالة على عمودين فقط من dataframe في pandas كانت الإجابة المقبولة   
    يمكنك استخدام الدالة apply لتطبيق أي دالة تريدها على الأعمدة التي تريد حيث نقوم بوضع axis=1 لاختيار الأعمدة بينما نضع axis=0 اذا اردنا اختيار صفوف بعينها، أنظر المثال التالي:
    In [1]: df Out[1]: 0 1 0 1.000000 0.000000 1 -0.494375 0.570994 2 1.000000 0.000000 3 1.876360 -0.229738 4 1.000000 0.000000 In [2]: def f(x): return x[0] + x[1] In [3]: df.apply(f, axis=1) Out[3]: 0 1.000000 1 0.076619 2 1.000000 3 1.646622 4 1.000000 أو يمكنك استخدام الكود التالي بتحديد أسماء الأعمدة التى تريدها:
    df['col3'] = df.apply(lambda x: f(x.col1, x.col2), axis=1) الكود التالي يوضح كيف تستخدم هذة الطريقة بعد تعريف دالة معينة:
    import pandas as pd df = pd.DataFrame({'ID':['1', '2', '3'], 'col1': [0, 1, 2], 'col2':[3, 4, 5]}) mylist = ['a', 'b', 'c', 'd', 'e', 'f'] def get_sublist(sta,end): return mylist[sta:end+1] df['col3'] = df.apply(lambda x: get_sublist(x.col1, x.col2), axis=1) ويكون الناتج كالتالي:
    ID col1 col2 col_3 0 1 0 3 [a, b, c, d] 1 2 1 4 [b, c, d, e] 2 3 2 5 [c, d, e, f] ويمكنك تحديد اسماء الأعمدة التي تريد لتطبيق الدالة عليهم مهما كان عددهم.
  10. إجابة Ahmed Sharshar سؤال في كيفية حذف عمود من dataframe في pandas كانت الإجابة المقبولة   
    يمكنك استخدام نفس الكود الذي حاولت استخدامه لكن بتعديل بسيط في طريقه الكتابه ليصبح كالتالي:
    del df['column_name'] كذلك يمكنك استخدام الدالة drop لنفس المهمة كالتالي:
    df = df.drop('column_name', 1) حيث أن 1 هو رقم ال axis بحيث أن 1 هو العمود بينما 0 هو الصف.
  11. إجابة Ahmed Sharshar سؤال في ظهور الخطأ 'utf-8' codec can't decode byte 0xda in position 6 أثناء قراءة ملفات csv في pandas كانت الإجابة المقبولة   
    يظهر هذ الخطأ بسبب عدم قدرة pandas على فك التكويد encoding الخاص ببعض ملفات ال csv.
    حيث أن read_csv تأخذ معامل parameter يدعي encoding ، وهو خاص بطريقة قراءة الملفات بشكل عام، ويكون في الأساس على القيمة "encoding = "utf-8 وهذا هو  الشائع لقراءة ملفات csv.
    لحل تلك المشكلة ما عليك سوى ضبطها بطريقة يدوية كالتالي:
    import pandas as pd data = pd.read_csv('file_name.csv', encoding='utf-8') سيقوم هذا بفك مشكلة التشفير في الملفات التي يظهر بها الخطأ.
  12. إجابة Ahmed Sharshar سؤال في الفرق بين map, applymap, apply في pandas كانت الإجابة المقبولة   
    دعنا نوضح الفرق بين كل دالة مع ذكر مثال عليها:
    DataFrame.apply تعمل على صف أو عمود كامل في المرة الواحدة، مثل المثال التالي: In [1]: df = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Ahmed', 'Ali', 'Moustafa', 'Mohammed']) In [2]: df Out[2]: b d e Ahmed -0.029638 1.081563 1.280300 Ali 0.647747 0.831136 -1.549481 Moustafa 0.513416 -0.884417 0.195343 Mohammed -0.485454 -0.477388 -0.309548 In [3]: f = lambda x: x.max() - x.min() In [4]: df.apply(f) Out[4]: b 1.133201 d 1.965980 e 2.829781 dtype: float64 لاحظ أننا قمنا بالعملية الحسابية مرة واحدة للعمود بأكمله.
    أما الدالة DataFrame.applymap والدالة Series.map فهي تقم بعمل العملية الحسابية مرة لكل عنصر على حدة، ‘أنظر المثالين الأتيين: #تطبيق الدالة applymap In [5]: format = lambda x: '%.2f' % x In [6]: df.applymap(format) Out[6]: b d e Ahmed -0.03 1.08 1.28 Ali 0.65 0.83 -1.55 Moustafa 0.51 -0.88 0.20 Mohammed -0.49 -0.48 -0.31 ونفس المهمة تستطيع تأديتها باستخدام الدالة map: In [122]: df['e'].map(format) Out[122]: Ahmed 1.28 Ali -1.55 Moustafa 0.20 Mohammed -0.31 Name: e, dtype: object  
  13. إجابة Ahmed Sharshar سؤال في إستبدال القيم NaN بأصفار في أحد الأعمدة في pandas كانت الإجابة المقبولة   
    يمكنك ببساطة استخدام الدالة DataFrame.fillna()  لاستبدالة قيم ال NaN بأي قيمه تريد،المثال التالي يوضح كيفية استخدامها لاستبدال NaN بالصفر في كل ال dataframe:
    In [2]: df Out[2]: 0 1 0 NaN NaN 1 -0.494375 0.570994 2 NaN NaN 3 1.876360 -0.229738 4 NaN NaN In [3]: df.fillna(0) Out[3]: 0 1 0 0.000000 0.000000 1 -0.494375 0.570994 2 0.000000 0.000000 3 1.876360 -0.229738 4 0.000000 0.000000 أما اذا أردت تحديد عمود معين لاستبدال القيم فيه فيمكنك عمل التالي:
    In [5]: df[1].fillna(0, inplace=True) #1 هو رقم العمود المراد استبدال قيمة Out[5]: 0 0.000000 1 0.570994 2 0.000000 3 -0.229738 4 0.000000 In [6]: df Out[6]: 0 1 0 NaN 0.000000 1 -0.494375 0.570994 2 NaN 0.000000 3 1.876360 -0.229738 4 NaN 0.000000 لذا اذا قمنا بتطبيق تلك الطريقة في البيانات الخاصة بك يمكنك عمل التالي:
    In[7]: df[2].fillna(0, inplace=True) Out[7]: itm Date Amount 420 2021-09-30 65211 421 2021-09-09 29424 421 2021-09-16 29877 421 2021-09-23 30990 421 2021-09-30 61303 485 2021-09-09 71781 485 2021-09-16 0.0000 485 2021-09-23 11072 485 2021-09-30 113702 489 2021-09-09 64731 489 2021-09-16 0.0000  
  14. إجابة Ahmed Sharshar سؤال في تغيير ترتيب الأعمدة في pandas كانت الإجابة المقبولة   
    اذا قمت بعرض ترتيب الأعمدة يظهر بالترتيب التالي:
    In [2]: cols = df.columns.tolist() In [3]: cols Out[3]: [0L, 1L, 2L, 3L, 4L, 'mean'] ويمكننا إعادة ترتيب الأعمدة كالتالي:
    In [5]: cols = cols[-1:] + cols[:-1] #اعادة ترتيب الأعمدة In [6]: cols Out[6]: ['mean', 0L, 1L, 2L, 3L, 4L] لذا اذا قمنا بعرض الأعمدة بالترتيب الجديد تظهر بهذا الشكل:
    In [9]: df = df[cols] In [10]: df Out[10]: mean 0 1 2 3 4 0 0.445543 0.445598 0.173835 0.343415 0.682252 0.582616 1 0.670208 0.881592 0.696942 0.702232 0.696724 0.373551 2 0.632596 0.662527 0.955193 0.131016 0.609548 0.804694 3 0.436653 0.260919 0.783467 0.593433 0.033426 0.512019 4 0.363371 0.131842 0.799367 0.182828 0.683330 0.019485 5 0.587165 0.498784 0.873495 0.383811 0.699289 0.480447 6 0.588529 0.388771 0.395757 0.745237 0.628406 0.784473 7 0.345149 0.147986 0.459451 0.310961 0.706435 0.100914 8 0.553195 0.394947 0.863494 0.585030 0.565944 0.356561 9 0.561593 0.689260 0.865243 0.136481 0.386582 0.730399  
  15. إجابة Ahmed Sharshar سؤال في تسطيح flatten بيانات على شكل هرمي hierarchal في pandas كانت الإجابة المقبولة   
    أسهل طريقة لفعل هذا هي بجعل الأعمدة في المستوى الثاني تقع في الامسوتى الأول كالتالي:
    df.columns = df.columns.get_level_values(0) اما اذا أردت دمج عدة أعمدة فرعية في عمود واحدة، كأخر عمودين في المثال الخاص بك، يمكن أن ستتخدم الكود التالي:
    df.columns = [' '.join(col).strip() for col in df.columns.values] أنظر تطبيقه على المثال الخاص بك في فصل الأعمدة:
    In [11]: [' '.join(col).strip() for col in df.columns.values] Out[11]: ['USAF', 'WBAN', 'day', 'month', 'piece1 sum', 'piece2 sum', 'temp max', 'temp min', 'year']  
  16. إجابة Ahmed Sharshar سؤال في إستخدام groupby لدمج العناصر بوجود الفاصل - في pandas كانت الإجابة المقبولة   
    يمكنك استخدام groupby مع الدالة agg لدمج عناصر عمودين سوياً بالشكل الذي تريد كالتالي:
    In [48]: df.groupby('col1')['animal'].agg('-'.join) Out[48]: col1 A Cat-Dog B Bird-Bat Name: val, dtype: object أو يمكنك انشاء dataframe جديدة وضم الأعمدة المدمجة لها بالكود التالي:
    df1 = df.groupby('col1')['animal'].agg('-'.join).reset_index(name='new')  
  17. إجابة Ahmed Sharshar سؤال في كيفية الكتابة على ملف إكسيل دون تعديل القيم الموجودة فيه باستخدام Pandas كانت الإجابة المقبولة   
    يمكنك إستخدام المكتبة openpyxl في حفظ البيانات من pandas كالتالي:
    import pandas from openpyxl import load_workbook book = load_workbook('test.xlsx') writer = pandas.ExcelWriter('test.xlsx', engine='openpyxl') writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) data_filtered.to_excel(writer, "Main", cols=['col1', 'col2']) writer.save() وهذا عن طريق تحويلة الى dictionary ثم حفظه على هذا الشكل.
    يمكنك كذلك استخدام pandas لاداء نفس الوظيفة كالتالي:
    with pd.ExcelWriter(path, mode='a') as writer: s.to_excel(writer, sheet_name='another sheet', index=False) الكود السابق يقوم بفتح صفحة جديدة tab يمكنك اضافة فيها بياناتك دون المساس بباقي علامات التبويب.
  18. إجابة Ahmed Sharshar سؤال في تغيير شكل التاريخ بداخل dataframe في pandas كانت الإجابة المقبولة   
    يمكنك استخدام الدالة dt.strftime حيث تقوم بتحويل التاريخ الى أي شكل تريده، الاكواد التالية توضح كيف يمكن استخدامها:
    import pandas as pd #انشاء العمود الذي يحتوى على التاريخ df = pd.DataFrame({'DOB': {0: '26/8/2021', 1: '26/8/2021'}}) print (df) DOB 0 26/8/2021 1 26/8/2021 #تحويله الى النوع datetime df['DOB'] = pd.to_datetime(df.DOB) print (df) DOB 0 2021-08-26 1 2021-08-26 #تحويل شكل التاريخ للشكل الذي تريد df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y') print (df) DOB DOB1 0 2021-08-26 08/26/2021 1 2021-08-26 08/26/2021 كذلك يمكنك استخدامها بشكل مختصر كالتالي:
    df['BOD'] = pd.to_datetime(df["BOD"].dt.strftime('%Y-%m'))  
  19. إجابة Ahmed Sharshar سؤال في عرض مزيد من أعمدة dataframe في الشاشة في pandas كانت الإجابة المقبولة   
    في نسخ pandas 0.23.4  والأعلى يمكنك إستخدام الدالةpandas.set_option(optname, val) لضبط حجم الشاشة لتظهر لك عدد الأعمدة التي تريد، أنظر الكود التالي كمثال:
    import pandas as pd pd.set_option('display.max_rows', 500) pd.set_option('display.max_columns', 500) pd.set_option('display.width', 1000) يمكنك ضبط القيم كما تريد لتظهر لك عدد الأعمدة التي تريد مع مراعاة أنه كلما زاد عدد الأعمدة صغر حجمها.
    يمكنك كذلك ضبطها لتظهر لك كل الأعمدة في ال dataframe ببساطة كالتالي:
    pd.set_option('display.expand_frame_repr', False)  
  20. إجابة Ahmed Sharshar سؤال في فصل عمود من القواميس إلى عدة أعمدة في pandas كانت الإجابة المقبولة   
    يمكنك انشاء هذا بسهولة عن طريق استخدام دالة apply(pd.Series). كالتالي:
    df = pd.DataFrame({'col1':[1,2,3], 'col2':[{'c':1}, {'d':3}, {'c':5, 'd':6}]}) df col1 col2 0 1 {u'c': 1} 1 2 {u'd': 3} 2 3 {u'c': 5, u'd': 6} df['b'].apply(pd.Series) col3 col4 0 1.0 NaN 1 NaN 3.0 2 5.0 6.0 بعد ذلك يمكنك دمجها مع بقية البيانات باستخدام concat كالتالي:
    pd.concat([df.drop(['col2'], axis=1), df['col2'].apply(pd.Series)], axis=1) col1 c d 0 1 1.0 NaN 1 2 NaN 3.0 2 3 5.0 6.0 كذلك يمكنك استخدام tolist بدلا من .apply(pd.series) :
    pd.concat([df.drop('b', axis=1), pd.DataFrame(df['b'].tolist())], axis=1) col1 c d 0 1 1.0 NaN 1 2 NaN 3.0 2 3 5.0 6.0 يمكنك ايضا استخدام json لفصل العمود عن بعضه كالتالي:
    import pandas as pd df2 = pd.json_normalize(df['Pollutant Levels'])  
  21. إجابة Ahmed Sharshar سؤال في إزالة كل الصفوف المتكررة في أعمدة معينة في pandas كانت الإجابة المقبولة   
    يمكنك إستخدام drop_duplicates كذلك في تحديد أعمدة بعينها لحذفها وليس كل الأعمدة، ويمكنك فعل ذلك كما في الكود التالي:
    import pandas as pd df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) df.drop_duplicates(subset=['A', 'C'], keep=False) ويكون الناتج:
    A B C 0 foo 1 B 1 bar 1 A هنا قد حذف بالفعل الأعمدة المتشابهة في الصفين A و C
  22. إجابة Ahmed Sharshar سؤال في حساب بعض القيم الإحصائية كالمتوسط لكل مجموعة من البيانات في pandas كانت الإجابة المقبولة   
    يمكنك إستخدام الدالة agg لحساب عدة قيم للمجموعات، وذلك بعد عمل groupby لها كالكود التالي:
    df[['col1', 'col2', 'col3', 'col4']].groupby(['col1', 'col2']).agg(['mean', 'count']) كمثال للبيانات الخاصة بك، يمكنك تطبيق بعض الحسابات على المجموعات التي نقوم بانشاءها كالتالي:
    In [5]: (df ...: .groupby(['col1', 'col2']) ...: .agg({ ...: 'col3': ['mean', 'count'], ...: 'col4': ['median', 'min', 'count'] ...: })) Out[5]: col4 col3 median min count mean count col1 col2 A B -0.810 -1.32 4 -0.372500 4 C D -0.110 -1.65 3 -0.476667 3 E F 0.475 -0.47 2 0.455000 2 G H -0.630 -0.63 1 1.480000 1 هنا قمنا بعمل groupby للأعمدة الأولى والثانية، ثم حساب المتوسط وعدد للعناصر في العمود الثالث وحساب المتوسط الحسابي وأقل قيمة وكذلك عدد العمود الرابع.
  23. إجابة Ahmed Sharshar سؤال في اختيار الأسطر التي تحوي على كلمة معينة في باندا pandas كانت الإجابة المقبولة   
    عندما قمت بإختبار حلك الذي قدمته:
    df[df['A'] == "hello world"] أظهر لي هذا الخطأ:
    ValueError: cannot mask with array containing NA / NaN values إذاً فالحل في حد ذاته ليس خطأً لكن عليك أن تعتبر وجود القيم nan، لذا يمكننا عمل تعديل بسيط ليصبح الكود سليماً كالتالي:
    df[df["A"].str.contains("Hello World", na=False)] هناك أيضا حل أخر باستخدم str.contains والتي تقوم بالبحث عن كلمة أو جملة معينة داخل dataframe، الكود التالي يؤدي المهمة التي تطلبها كذلك:
    df[df['A'].str.contains("hello world")]  
  24. إجابة Ahmed Sharshar سؤال في دمج أكثر من عمود في dataframe بفواصل مختلفة في pandas كانت الإجابة المقبولة   
    يمكنك إستخدام المكتبة itertools بحيث تقوم بعمل عمود جديد عبارة عن مزيج من الأعمدة الأخرى بالشكل الذي تريده.
    الكود التالي يوضح كيف يمكن أن تقوم بها:
    from itertools import chain dataframe['features'] = dataframe.apply(lambda x: ''.join([*chain.from_iterable((v, f' <{i}> ') for i, v in enumerate(x))][:-1]), axis=1) print(dataframe) ويكون شكل الخرج هو:
    col_1 col_2 col_3 features 0 a name_a age_a a <0> name_a <1> age_a 1 b name_b age_b b <0> name_b <1> age_b 2 c name_c age_c c <0> name_c <1> age_c 3 d name_d age_d d <0> name_d <1> age_d حيث قمنا بإنشاء العمود features والذي يحتوى شكل البيانات التي تريد.
  25. إجابة Ahmed Sharshar سؤال في كيف يمكننا المرور على أسطر ال DataFrame في Pandas كانت الإجابة المقبولة   
    يمكننا إستخدام الدالة DataFrame.iterrows والتي تمكننا باستخدام الحلقات التكرارية بداخل dataframe في pandas.
    المثال التالي يوضح ما تريد أن تقوم به.
    import pandas as pd data = [{'a':1, 'b':2}, {'a':3,'b':4}, {'a':5,'b':6}] df = pd.DataFrame(data) for index, row in df.iterrows(): print(row['a'], row['b']) >>> 1 2 3 4 5 6  
×
×
  • أضف...