مكتبة Pandas – الخطوة الثانية في علم البيانات بالبايثون ج1

يقدم المقال شرحًا مبسطًا عن أحد أهم مكتبات علم البيانات في البايثون

اهلاً بكم في ثاني مقالات سلسلة مكتبات علم البيانات بـ لغة البايثون.

قدمتُ لكم في المقال السابق تعريفاً بسيطاً بمكتبة Numpy وكيفية تثبيتها والتعامل معها، وفي مقالنا هذا سوف نتكلم عن مكتبة Pandas .

مقدمة

الهدف الأساسي لمكتبة Pandas هو إجراء ما يسمى ب Data Munging، ونقصد بهذا المصطلح إجراء تغييرات على بيانات أساسية غير مرتبة (Raw data) بحيث تقوم عملية التغيير هذه بتحويل البيانات إلى بيانات مفهومة ومفيدة.

سنتعرف خلال هذا الموضوع (والذي يتكون من مقالين) على:

 

  • كيفية تعريف إطار بيانات مكتبة Pandas.
  • كيفية تحديد مؤشر أو عمود من إطار البيانات.
  • كيفية إضافة مؤشر، صف أو عمود إلى إطار البيانات.
  • حذف فهرس، صف أو عمود من إطار البيانات.
  • كيفية إعادة تسمية الأعمدة والفهارس في إطار البيانات.
  • كيفية عمل Format للبيانات في إطار البيانات.

وفي الجزء الثاني سنتحدث عن:

  • إنشاء إطار بيانات فارغ.
  • معرفة متى، وكيف، ولماذا نقوم بإعادة تغيير شكل إطار البيانات.
  • كيفية المرور على البيانات وقراءتها في إطار البيانات.
  • كيفية تصدير إطار البيانات إلى الملف خارجي.

لن أتحدث عن كيفية تثبيت المكتبة لسهولة الأمر وسندخل في موضوع المكتبة بشكل مباشر.

ما هو إطار البيانات في مكتبة Pandas؟

نستطيع تعريف إطار البيانات هنا بأنه عبارة عن شكل من أشكال الجداول في قاعدة البيانات، ويتكون من أعمدة وصفوف، بحيث تُمثل الأعمدة خصائص معينة وتُمثل الصفوف القيم التي تأخذها هذه الأعمدة.

يتكون إطار البيانات في مكتبة Pandas من 3 عناصر رئيسية:

  • البيانات (data).
  • المؤشر أو الفهرس (index).
  • العمود (column).

 

كيفية بناء إطار البيانات في مكتبة Pandas

يُعتبر بناء إطار البيانات الخطوة الأولى عند بدءك في إجراء عملية Data Munging باستخدام لغة البايثون. تستطيع أن تقوم ببناء إطار البيانات فارغاً دون بيانات، وتستطيع أن تقوم ببنائه باستخدام تراكيب أخرى مثل Series أو مصفوفة Numpy أو حتى من خلال إطار بيانات اخر.

في هذا الجزء سنغطي كيفية بناء إطار بيانات باستخدام مصفوفة Numpy وتراكيب أخرى وفي الجزء المعنون ب “إنشاء إطار بيانات فارغ” في المقال القادم، سنشرح كيفية بناء الإطار من البداية دون الاعتماد على أي تراكيب بيانات خارجية.

في البداية عليك القيام باستيراد المكتبات اللازمة للعمل وهي مكتبتي Numpy و Pandasبالشكل التالي:

>> Import numpy as np
>> Import pandas as pd

لنفترض أنه يوجد لدينا مصفوفة Numpy بالشكل التالي:

>> np_arr = np.array([[' ','Col1','Col2'],['Row1',1,2],['Row2',3,4]  ])

فإننا نستطيع بناء إطار بيانات بإستخدام np_arr بالطريقة التالية:

>> df =pd.DataFrame(data=np_arr[1:,1:],
                 index =  np_arr[1:,0],columns=np_arr[0,1:])

لاحظ كيفية إستخدام مصفوفة Numpy المسماة np_arr في بناء إطار البيانات، حيث أنه في البداية نقوم بتحديد البيانات في np_arr بإستخدام عملية Indexing ومن ثن نقوم بتحديد المؤشر الخاص بإطار البيانات، ثم نقوم بتحديد أسماء الأعمدة للإطار.

تستطيع مراجعة مقال مكتبة Numpy لمعرفة كيفية إجراء عمليات subseting على مصفوفات Numpy.

كما ويمكنك بناء إطار البيانات من التراكيب التالية:

القاموس (dictionary):

>> my_dict = {1: ['1', '3'], 2: ['1', '2'], 3: ['2', '4']}

>> pd.DataFrame(my_dict)

 

 

إطار بيانات اخر

>> my_df = pd.DataFrame(data=[4,5,6,7], index=range(0,4), columns=['A'])

>> pd.DataFrame(my_df)

 

 

 

Series

>> my_series = pd.Series({"United Kingdom":"London", "India":"New Delhi", "United States":"Washington", "Belgium":"Brussels"})

>> pd.DataFrame(my_series)

 

 

 

 

لاحظ أن المؤشر الخاص بإطار البيانات المبني على Series يحتوي على مفاتيح القاموس الأصلي ولكن هذه المفاتيح غير مرتبة.

بعد أن قمت بإنشاء إطار البيانات، تستطيع معرفة بعض التفاصيل عنه وذلك باستخدام بعض الخصائص والدوال التابعة لإطار البيانات.

فمثلا، تستطيع التعرف على شكل إطار البيانات (أبعاده) باستخدام الدالة shape، كما تستطيع معرفة ارتفاع إطار البيانات (عدد صفوفه) بتمرير الخاصية index للدالة len كما في المثال التالي:

>> df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]))

>> print(df.shape)
(2, 3)

>> print(len(df.index))
2

تستطيع استخدام df[0].count لمعرفة ارتفاع اطار البيانات, ولكن هذه الطريقة تستثني القيم الفارغة (NaN) اذا وجدت، لذلك فإن استخدام هذه الطريقة لها هدفها الخاص وغير محبذة لمعرفة ارتفاع اطار البيانات.

الان وبعد أن قمت بوضع بياناتك في إطار بيانات Pandas، حان الوقت للعمل الحقيقي.

من خلال العناوين القادمة، سوف تخطو خطواتك الأولى في التعامل مع إطار البيانات، حيث سنقوم بتغطية العمليات الأساسية على إطار البيانات مثل الإضافة، تحديد (select)، الحذف، إعادة التسمية وغيرها. وبعد ذلك سوف تستخدم هذه العمليات للذهاب قدماً لمواضيع أكثر تقدما في التعامل مع إطار البيانات.

 كيفية تحديد مؤشر أو عمود في اطار البيانات

قبل أن تتعلم كيفية إضافة، حذف أو إعادة تسمية مكونات إطار البيانات لديك, لابد أن تتعلم كيفية تحديد هذه المكونات واختيارها بطريقة صحيحة.

لنفترض وجود إطار df ببيانات بهذا الشكل:

 

وتريد أن تقوم بتحديد البيانات الواقعة في المؤشر 0 والعمود A، فلديك الخيارات التالية لعمل ذلك:

print(df.iloc[0][0])

print(df.loc[0]['A'])

print(df.at[0,'A'])

print(df.iat[0,0])

print(df.get_value(0, 'A'))

من خلال النظر للطرق السابقة لتحديد البيانات في إطار البيانات، يتبين لنا أنه يوجد خيارين، الأول تحديد البيانات باستخدام اسم العمود، والثاني تحديد البيانات باستخدام الموقع للمؤشر أو العمود.

كيفية إضافة مؤشر، صف أو عمود إلى إطار البيانات

عند بناء إطار البيانات، لديك الخيار بإضافة المُعامل الذي يحدد المؤشر الذي تريده من خلال المُعطى index. في حالة عدم قيامك بذلك، فإن إطار البيانات الخاص بك، وبشكل تلقائي، سيأخذ مؤشر رقمي يبدأ من 0 وحتى اخر صف من البيانات.

في حالة وجود إطار بيانات لديك ذو مؤشر رقمي تلقائي، فهذا لا يعني أنك لا تستطيع تعديل هذا الأمر.

تستطيع تغيير المؤشر الخاص بإطار البيانات لديك ليصبح عمودا اخرا، وذلك باستخدام الدالة set_index بالطريقة التالية:

df.set_index('C')

إضافة صفوف لإطار البيانات

قبل البدء بالحديث عن موضوع الإضافة على اطار البيانات، لابد من شرح مفهوم loc وكيف يختلف عن طرق التأشير الأخرى مثل iloc و ix.

يعمل loc على إسم (label) المؤشر، مما يعني أنه لو مررت الرقم 2 للدالة loc فإنها سوف تبحث في اطار البيانات عن القيم التي لها اسم مؤشر بقيمة 2.

بينما iloc يعمل على موقع المؤشر، فلو مررت الرقم 2 للدالة iloc فإن النتيجة ستشمل القيم الموجودة في موقع المؤشر رقم 2.

طريقة التأشير باستخدام ix تُعتبر أكثر تعقيدا، حيث عندما يكون المؤشر من نوع رقم، فإن ix تعمل مثل loc أما إذا لم يكون المؤشر رقماً، فإن ix ستعمل عمل iloc.

قد يكون ما ذكرناه معقدا أو غامضا، لذلك بالمثال يتضح المقال.

لنفترض وجود اطار بيانات df (نوع المؤشر ليس برقم) بالشكل التالي:

df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), index= [2, 'A', 4], columns=[48, 49, 50])

ستكون نتيجة تمرير 2 للدالة loc ستكون كالتالي:

>> df.loc[2]

48   1
49   2
50   3

Name: 2, dtype: int32

وللدوال iloc و ix كالتالي:

>> df.iloc[2]

48   7
49   8
50   9

Name: 4, dtype: int32

>> df.ix[2]

48   7

49   8

50   9

Name: 4, dtype: int32

بعد أن قمنا بشرح طرق التأشير السابقة، تُصبح إضافة الصفوف لإطار البيانات أمر سهلاً.

ملاحظة/ يُنصح باستخدام طريقة التأشير loc في الإضافة.

لإضافة صف بيانات لإطار البيانات بمؤشر جديد قيمته 5 ننفذ السطر التالي:

df.loc[5] = [11, 12, 13]

ويصبح إطار البيانات بالشكل التالي:

 

لتعديل قيم الصف الأول في إطار البيانات السابق، نستخدم نفس الطريقة ولكن بقيمة المؤشر الذي يؤشر على الصف الأول:

 

df.loc[2] = [10, 10, 10]

ويصبح إطار البيانات بالشكل التالي:

 

إضافة أعمدة لإطار البيانات

لإضافة عمود جديد باسم ‘A’ لإطار البيانات df بالقيم [10,20,30,40] ننفذ السطر التالي:

df['A'] = [10,20,30,40]

ويصبح إطار البيانات بالشكل التالي:

 

إعادة تهيئة مؤشر إطار البيانات

عندما يكون مؤشر إطار البيانات ليس بالشكل الذي تريده، تستطيع باستخدام الدالة reset_index إعادة تهيئة المؤشر.

لإعادة تهيئة المؤشر لإطار البيانات df ننفذ السطر التالي:

df.reset_index(level=0, drop=True)

ويصبح إطار البيانات بالشكل التالي:

لاحظ أننا فقدنا قيم المؤشر السابقة، لذلك، وفي حالة أردنا أن نُبقي على قيم المؤشر السابق موجودة، بحيث يتم إضافتها كعمود جديد، نقوم باستبدال المعامل drop بالمعامل inplace:

df.reset_index(level=0, inplace=True)

ويصبح شكل الإطار كالتالي:

 

 

حذف فهرس، صف أو عمود من إطار البيانات

تعلمنا سابقا كيفية تحديد البيانات من إطار البيانات، وتعلمنا أيضا كيفية إضافة البيانات. سنتناول فيما يلي نوع جديد من العمليات التي من الممكن أن يتم إجراءها على إطار البيانات وهي عملية الحذف.

حذف المؤشر

تستطيع إتباع أربعة خيارات لحذف المؤشر من إطار البيانات.

الأول هو أن تقوم بإعادة تهيئة المؤشر كما ذكرنا سابقا.

الثاني هو أن تحذف اسم المؤشر باستخدام الأمر del df.index.name.

الثالث أن تقوم بحذف تكرار قيم المؤشر وذلك يشمل إعادة تهيئة المؤشر، ثم حذف التكرار كما في المثال التالي:

df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [40, 50, 60], [23, 35, 37]]),index= [2.5, 12.6, 4.8, 4.8, 2.5],columns=[48, 49, 50])                 

df.reset_index().drop_duplicates(subset='index',keep='last').set_index('index')

الرابع حذف المؤشر والصف المقابل له باستخدام الأمر التالي:

df.drop(df.index[1])

حذف عمود من إطار البيانات

لحذف عمود من إطار البيانات نستخدم الدالة drop ونمرر لها اسم العمود الذي نريد حذفه، ثم نحدد نوع الحذف بأنه حذف عمود وذلك بإعطاء المعامل axis القيمة 1 ومن ثم نحدد إذا أردنا أن نقوم بإجراء التغيير على الإطار بشكل مباشر أم لا:

df.drop('A', axis=1, inplace=True)

تستطيع حذف العمود باستخدام موقعه بالطريقة التالية:

df.drop(df.columns[[1]], axis=1)

حذف صف من إطار البيانات

تستطيع استخدام طريقة حذف المؤشر مع الصف لحذف صف من إطار البيانات والتي ذكرناها سابقا.

في حالة وجود صفوف مكررة في اطار البيانات، تستطيع استخدام الدالةdrop_duplicates  لحذف الصفوف المكررة بغض النظر عن قيمة المؤشر.

df.drop_duplicates()

كما أن من الممكن حذف الصفوف بناءً على تكرار قيم في عمود معين. لنفترض وجود إطار بيانات df بالشكل التالي:

 

لاحظ وجود القيمة 2 مكررة للعمود باسم 49، تستطيع حذف الصفوف التي تحتوي على هذه القيمة باستخدام الامر التالي:

df.drop_duplicates([49], keep='last')

 

كيفية إعادة تسمية الأعمدة والفهارس في إطار البيانات

لإعطاء المؤشر أو العمود في إطار البيانات اسم مختلف، عليك استخدام الدالة rename لهذا الغرض:

newcols = {

    48: 'new_column_1',

    49: 'new_column_2',

    50: 'new_column_3'

}

df.rename(columns=newcols, inplace=True)

وسيكون شكل إطار البيانات كالتالي:

 

ولإجراء التغيير على اسم المؤشر نستبدل columns بـ index كالتالي:

df.rename(index={2.5: 'a'})

وسيكون شكل إطار البيانات كالتالي:

 

 

من خلال ما سبق، تم الإجابة عن الأسئلة الأساسية لاستخدام مكتبة Pandas واطار البيانات فيها, ولقد حان الوقت للذهاب أبعد من ذلك كي تجهز نفسك للاستخدام الواقعي والحقيقي لهذه المكتبة، لأنه ببساطة ما تكلمنا عنه جزء بسيط مما تبقى.

كيفية عمل Format للبيانات في إطار البيانات

في الأغلب، ستحتاج أن تكون قادرا على اجراء عمليات على قِيم البيانات الموجودة في إطار البيانات. فمثلا، قد تحتاج لاستبدال بعض القيم بقيم أخرى أو حذف وإضافة بعض النصوص في الخلايا داخل إطار البيانات، وهكذا.

سنتكلم فيما يلي عن بعض الأمثلة التي تشرح كيفية تغيير البيانات في إطار البيانات.

استبدال النصوص في إطار البيانات

لاستبدال نصوص محددة في إطار البيانات لديك، تستطيع ببساطة استخدام الدالة replace، بحيث تقوم بتمرير القيم التي تريد تغييرها ثم القيم الجديدة.

لنفترض وجود اطار بيانات df بالشكل التالي:

 

 

وأردنا أن نستبدل الكلمات ‘Awful’, ‘Poor’, ‘OK’, ‘Acceptable’, ‘Perfect’ بقيم رقمية 0,1,2,3,4 على الترتيب، نقوم بتنفيذ السطر التالي:

df.replace(['Awful', 'Poor', 'OK', 'Acceptable', 'Perfect'], [0, 1, 2, 3, 4])

وسيكون شكل الإطار كالتالي:

 

إزالة أجزاء من النصوص في إطار البيانات

تُعتبر هذه العملية روتينية ومتكررة في مهام العمل الحقيقية عند التعامل مع البيانات باستخدام مكتبة Pandas ، ويتم تنفيذ عملية التغيير بشكل مباشر على القيم الموجودة في إطار البيانات.

لنفترض وجود اطار بيانات df بالشكل التالي:

 

لو أردنا أن نقوم بإزالة إشارة + و – من عمود result بالإضافة لإزالة الأحرف منه، نقوم بتنفيذ السطر التالي:

df['result']=df['result'].map(lambda x: x.lstrip('+-').rstrip('aAbBcC'))

في الأمر السابق، قمنا باستخدام الدالة map على العمود result لتطبيق دالة lambda على كل عناصر العمود، بحيث تأخذ الدالة كل عنصر وتقوم بإزالة الإشارات + و – من على شمال العنصر، وتزيل أي حرف من على يمنيه.

تطبيق دالة على إطار البيانات أو جزء منه

عند التعامل مع إطار البيانات الذي يحتوي أرقاما، فغالباً ما ستحتاج لتطبيق دالة على البيانات الموجودة فيه أو جزء منها، فمثلا، لو افترضنا إطار البيانات df يحتوي على أرقام وأردنا مضاعفة هذه القيم، نُنفذ السطر التالي:

df.apply(lambda x: x*2)

في السطر السابق، سيتم المرور على كافة القيم في إطار البيانات وإجراء عملية ضربها بالقيمة 2.

من الممكن أن نقوم بإجراء هذه العملية على عمود واحد:

df['A'].apply(lambda x: x*2)

وكذلك تستطيع أن تقوم بنفس الأمر على صف، فمثلا، لإجراء عملية الضرب على الصف الأول:

df.loc[0].apply(lambda x: x*2)

إلى هنا انتهى الجزء الأول من هذا الموضوع.

سوف نتكلم في الجزء الثاني من هذا المقال عن كيفية إنشاء إطار بيانات فارغ، كما وسنتحدث عن الأشكال التي من الممكن تحويل إطار البيانات لها ومتى نقوم بذلك. وسنتناول في الجزء الثاني أيضا كيفية المرور على كافة البيانات في الاطار وكيفية حفظ الإطار في ملف خارجي.

الرابط الأصلي للمقال:

http://bit.ly/2KjacE1

 

كلمات دليلية: pandas python
0
إعجاب
169
مشاهدات
0
مشاركة
1
متابع

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !