Ahmed Sharshar
الأعضاء-
المساهمات
348 -
تاريخ الانضمام
-
تاريخ آخر زيارة
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Ahmed Sharshar
-
يمكنك استخدام الدالة 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] ويمكنك تحديد اسماء الأعمدة التي تريد لتطبيق الدالة عليهم مهما كان عددهم.
-
يمكنك استخدام نفس الكود الذي حاولت استخدامه لكن بتعديل بسيط في طريقه الكتابه ليصبح كالتالي: del df['column_name'] كذلك يمكنك استخدام الدالة drop لنفس المهمة كالتالي: df = df.drop('column_name', 1) حيث أن 1 هو رقم ال axis بحيث أن 1 هو العمود بينما 0 هو الصف.
-
في الواقع هناك طريقيتين سهلتين للحصول على الفرق بين dataframes: الأولى عن طريق جمع الاثنين معا ثم اختيار العناصر التي لا تشتركان فيهم سوياً كالتالي: In [2]: common = df1.merge(df2,on=['col1','col2']) print(common) col1 col2 0 1 6 1 2 7 2 3 8 df1[(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))] Out[2]: col1 col2 3 4 9 4 5 10 الثانية عن طريق اختيار العناصر التي لا تتواجد في ال dataframe الصغيرة باستخدام الدالة isin كالتالي: In [3]: df1[~df1.isin(df2)].dropna() Out[3]: col1 col2 3 4 9 4 5 10 لاحظ استخدام العلامة ~ والتي تعني not او النفي، وهنا تعني "غير متواجد" أي تختار العناصر من df1 غير المتواجدة في df2
- 3 اجابة
-
- 1
-
يظهر هذ الخطأ بسبب عدم قدرة 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') سيقوم هذا بفك مشكلة التشفير في الملفات التي يظهر بها الخطأ.
-
دعنا نوضح الفرق بين كل دالة مع ذكر مثال عليها: 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
-
يمكنك استخدام الدالة json_normalize() لتسطيح البيانات flatten العائدة من ال api بعد ذلك تحولها الى dataframe بسهوله، الكود التالى يوضح تلك الخطوات: from urllib2 import Request, urlopen import json import pandas as pd path1 = '40,-81.1' request=Request('http://maps.googleapis.com/maps/api/elevation/json?locations='+path1+'&sensor=false') response = urlopen(request) elevations = response.read() data = json.loads(elevations) df = pd.json_normalize(data['results']) يمكنك كذلك تحويلها الى قاموس dictionary ثم تحويلها الى dataframe كالتالي: train = pd.DataFrame.from_dict(data, orient='index') train.reset_index(level=0, inplace=True) اذا قمت بطباعة البيانات في الحالتين ستجدها على الشكل والصيغة dataframe.
- 2 اجابة
-
- 1
-
يمكنك ببساطة استخدام الدالة 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
-
اذا قمت بعرض ترتيب الأعمدة يظهر بالترتيب التالي: 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
-
في البداية عليك أن تتاكد أن عمود التاريخ على هيئة datetime كالتالي: df['date'] = pd.to_datetime(df['date']) بعد ذلك تختار الفترة التي تريد اختيار الصفوف بينها كالتالي: mask = (df['date'] > start_date) & (df['date'] <= end_date) مثال على البيانات الخاصة بك، يمكنك اختبار الكود التالي: import numpy as np import pandas as pd df = pd.DataFrame(np.random.random((200,3))) df['date'] = pd.date_range('2021-1-1', periods=200, freq='D') mask = (df['date'] > '2021-9-1') & (df['date'] <= '2021-9-10') print(df.loc[mask]) ويكون الخرج كالتالي: 0 1 2 date 153 0.208875 0.727656 0.037787 2021-09-02 154 0.750800 0.776498 0.237716 2021-09-03 155 0.812008 0.127338 0.397240 2021-09-04 156 0.639937 0.207359 0.533527 2021-09-05 157 0.416998 0.845658 0.872826 2021-09-06 158 0.440069 0.338690 0.847545 2021-09-07 159 0.202354 0.624833 0.740254 2021-09-08 160 0.465746 0.080888 0.155452 2021-09-09 161 0.858232 0.190321 0.432574 2021-09-10 أو يمكنك الدالة df.loc[start_date:end_date] لاختيار الفترة التي تريدها كالتالي: import numpy as np import pandas as pd df = pd.DataFrame(np.random.random((200,3))) df['date'] = pd.date_range('2021-1-1', periods=200, freq='D') df = df.set_index(['date']) print(df.loc['2021-9-1':'2021-9-10']) ويكون لها نفس الخرج كالدالة السابقة.
- 2 اجابة
-
- 1
-
في pandas النسخة بداية من 1.2 أو أحدث، يمكنك استخدام الدالة merge مباشرة حيث توفر تلك الخاصية كالتالي: from pandas import DataFrame df1 = DataFrame({'col1':[a,b],'col2':[c,d]}) df2 = DataFrame({'col3':[e,f]}) df1.merge(df2, how='cross') أما في النسخ الأقدم فيجب تعريف الضرب بشكل خاص كما نفعل في الضرب في SQL بحيث نقوم بعملية الضرب على المفتاح key الذي يجب أن يكون متشابها بين الأعمدة كالتالي: from pandas import DataFrame, merge df1 = DataFrame({'key':[1,1], 'col1':[a,b],'col2':[c,d]}) df2 = DataFrame({'key':[1,1], 'col3':[e,f]}) merge(df1, df2,on='key')[['col1', 'col2', 'col3']] وفي الحالتين يكون الخرج كالتالي: col1 col2 col3 0 a c e 1 a c f 2 b d e 3 b d f
- 3 اجابة
-
- 1
-
أسهل طريقة لفعل هذا هي بجعل الأعمدة في المستوى الثاني تقع في الامسوتى الأول كالتالي: 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']
-
يمكنك استخدام 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')
-
يمكنك استخدام الدالة get_close_matches للمقارنة بين العناصر وربط العناصر المتشابهة سويا ثم استخدام الدالة join لجمعهم سويا مثل الكود التالي: In [1]: import difflib In [2]: difflib.get_close_matches Out[3]: <function difflib.get_close_matches> In [4]: df2.index = df2.index.map(lambda x: difflib.get_close_matches(x, df1.index)[0]) In [5]: df2 Out[5]: letter one a two b three c four d five e In [6]: df1.join(df2) Out[6]: number letter one 10 a two 20 b three 30 c four 40 d five 50 e كذلك يمكنك استخدام الدالة merge اذا كانت الdataframes علي هيئة أعمدة كالتالي: df1 = DataFrame([[10,'one'],[20,'two'],[30,'three'],[40,'four'],[50,'five']], columns=['number', 'name']) df2 = DataFrame([['a','one'],['b','two'],['c','three'],['d','four'],['e','five']], columns=['letter', 'name']) df2['name'] = df2['name'].apply(lambda x: difflib.get_close_matches(x, df1['name'])[0]) df1.merge(df2) أو استخدام المكتبة fuzzywuzzy لجمعهم سويا كالتالي: from fuzzywuzzy import fuzz from fuzzywuzzy import process fuzzy_merge(df1, df2, 'index', 'index', threshold=80)
- 3 اجابة
-
- 1
-
هناك عدة طرق للقيام بهذا، مثلا يمكنك فقط الابقاء على الصفوف التي تحتوى على قيم بدلا من إزالة الصفوف التي تحتوى على NaN كالتالي: df = df[df['value'].notna()] أو يمكنك إزالة الصفوف التي تحتوى على قيم NaN كالتالي: df.dropna(subset=['value']) اما اذا أردت ازالة الصف اذا كان كل قيم أعمدته ب NaN يمكنك استخدام الكود التالي: df.dropna(how='all')
- 3 اجابة
-
- 1
-
لو أن كلا العمودين من النوع string يمكنك دمجهما مباشرة بالكود التالي: df["period"] = df["Year"] + df["month"] اما اذا كان احد الأعمدة أو كلاهما ليس من صيغة string يجب تحويله اولا ثم دمجهمها: df["period"] = df["Year"].astype(str) + df["month"] أو يمكنك استخدام الكود التالي ايضا كطريقة أخرى: df = pd.DataFrame({'Year': ['2020', '2021'], 'month': ['june', 'july']}) df['period'] = df[['Year', 'month']].apply(lambda x: ''.join(x), axis=1) ويكون الخرج على الشكل التالي: Year month period 0 2020 june 2021june 1 2021 july 2021july اما اذا أردت دمج العديد من الأعمدة سويا يمكنك استخدام الدالة agg لعمل هذا كالتالي: df['period'] = df[['Year', 'month', ...]].agg('-'.join, axis=1)
-
يمكنك إستخدام المكتبة 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 يمكنك اضافة فيها بياناتك دون المساس بباقي علامات التبويب.
-
يمكنك استخدام الدالة iloc أو الدالة .loc من أجل تحديد أماكن العناصر التي تحقق الشرط الذي تريد تغييره كالتالي: edge = df.my_channel > 100 column_name = 'my_channel' df.loc[edge, column_name] = 0 أو في سطر واحد يمكنك كتابتها كالتالي: df.loc[df.my_channel > 100, 'my_channel'] = 0
- 4 اجابة
-
- 1
-
يمكنك استخدام الدالة 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'))
-
في نسخ 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)
-
يمكنك انشاء هذا بسهولة عن طريق استخدام دالة 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'])
-
يمكنك إستخدام df.loc[i] حيث i هي رقم الصف المراد إضافته، يمكنك إستعمالها كالتالي: import pandas as pd from numpy.random import randint df = pd.DataFrame(columns=['lib', 'qty1', 'qty2']) for i in range(5): df.loc[i] = ['Row' + str(i)] + list(randint(10, size=2)) df Col1 Col2 Col3 0 Row0 3 3 1 Row1 2 4 2 Row2 2 8 3 Row4 2 1 4 Row5 9 6 كذلك يمكنك عمل قاموس dictionary وإضافة العناصر فية ثم تحويله للشكل dataframe كالتالي: rows = [] for row in input_rows: dict1 = {} dict1.update(anything) rows.append(dict1) df = pd.DataFrame(rows)
-
يمكنك إستخدام 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
-
الكود الذي قمت بكتابته هو صحيح الا حد كبير الا انه ينقصه جزء صغير، يمكنك النظر في الكود التالي: import pandas as pd import glob path = r'C:\DRO\DCL_rawdata_files' # use your path all_files = glob.glob(path + "/*.csv") li = [] for filename in all_files: df = pd.read_csv(filename, index_col=None, header=0) li.append(df) frame = pd.concat(li, axis=0, ignore_index=True) لاحظ أنني قمت بوضع header = 0 وذلك لجعل أول صف في ملفات ال csv هو عنوان العمود.
- 2 اجابة
-
- 1
-
يمكنك ببساطة إستخدام map كالتالي: df1['Sex'] = df1['Name'].map(df2.set_index('Name')['Sex']) print (df1) Name Age Sex 0 Tom 34 M 1 Sara 18 NaN 2 Eva 44 F 3 Jack 27 M 4 Laura 30 NaN كذلك هناك طريقة باستخدام merge واستخدام ال left join بحيث نقوم بدمجهم سويا من اليسار كالتالي: df = df3.merge(df2[['Name','Sex']], on='Name', how='left') print (df) Name Age Sex 0 Tom 34 M 1 Sara 18 NaN 2 Eva 44 F 3 Jack 27 M 4 Laura 30 NaN
-
يمكنك إستخدام الدالة 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 للأعمدة الأولى والثانية، ثم حساب المتوسط وعدد للعناصر في العمود الثالث وحساب المتوسط الحسابي وأقل قيمة وكذلك عدد العمود الرابع.