أتقن فن إنشاء Pandas DataFrame. يغطي هذا الدليل تهيئة DataFrames من القواميس والقوائم ومصفوفات NumPy والمزيد لمحترفي البيانات العالميين.
إنشاء Pandas DataFrame: نظرة متعمقة في تهيئة هيكل البيانات
مرحبًا بكم في عالم معالجة البيانات باستخدام Python! يكمن في قلب كل مهمة تحليل بيانات تقريبًا مكتبة Pandas، وحجر الزاوية فيها هو DataFrame. فكر في DataFrame على أنه إصدار ذكي وقوي ومرن من جدول بيانات أو جدول قاعدة بيانات، يعيش داخل بيئة Python الخاصة بك. إنها الأداة الأساسية لتنظيف البيانات وتحويلها وتحليلها وتصورها. ولكن قبل أن تتمكن من إجراء أي من سحر البيانات هذا، يجب عليك أولاً إتقان فن إنشاء DataFrame. يمكن لكيفية تهيئة هيكل البيانات الأساسي هذا أن تحدد المرحلة لتحليلك بأكمله.
تم تصميم هذا الدليل الشامل لجمهور عالمي من محللي البيانات والعلماء والمهندسين الطموحين والممارسين. سوف نستكشف الطرق الأكثر شيوعًا وفعالية لإنشاء Pandas DataFrames من البداية. سواء كانت بياناتك في قاموس أو قائمة أو مصفوفة NumPy أو تنسيق آخر، ستزودك هذه المقالة بالمعرفة والأمثلة العملية لتهيئة DataFrames بثقة وكفاءة. لنبني أساسنا.
ما هو Pandas DataFrame بالضبط؟
قبل أن نبدأ البناء، دعنا نوضح ما الذي نقوم بإنشائه. Pandas DataFrame هو هيكل بيانات جدولي ثنائي الأبعاد وقابل لتغيير الحجم وغير متجانس بشكل محتمل. دعنا نحلل ذلك:
- ثنائي الأبعاد: يحتوي على صفوف وأعمدة، تمامًا مثل جدول البيانات.
- قابل لتغيير الحجم: يمكنك إضافة أو إزالة الصفوف والأعمدة بعد إنشاء DataFrame.
- غير متجانس: يمكن أن تحتوي الأعمدة على أنواع بيانات مختلفة. على سبيل المثال، يمكن أن يحتوي أحد الأعمدة على أرقام (أعداد صحيحة أو أرقام فاصلة)، ويمكن أن يحتوي عمود آخر على نص (سلاسل)، ويمكن أن يحتوي عمود ثالث على تواريخ أو قيم منطقية (صواب/خطأ).
يحتوي DataFrame على ثلاثة مكونات رئيسية:
- البيانات: القيم الفعلية الموجودة داخل الهيكل، منظمة في صفوف وأعمدة.
- الفهرس: تسميات الصفوف. إذا لم توفر فهرسًا، فستقوم Pandas بإنشاء فهرس افتراضي يبدأ من 0. يوفر الفهرس طريقة قوية للوصول إلى البيانات ومحاذاتها.
- الأعمدة: تسميات الأعمدة. هذه ضرورية للوصول إلى سلاسل بيانات محددة داخل DataFrame.
يعد فهم هذا الهيكل أمرًا أساسيًا لفهم كيفية إنشاء DataFrames ومعالجتها بفعالية.
الأساس: استيراد Pandas
أول الأشياء أولاً. لاستخدام Pandas، يجب عليك استيراد المكتبة إلى برنامج Python النصي أو دفتر الملاحظات. الاتفاقية المقبولة عالميًا، والتي يتبعها المحترفون في جميع أنحاء العالم، هي استيرادها بالاسم المستعار pd. هذا الاسم المستعار البسيط يجعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة والاختصار.
import pandas as pd
import numpy as np # غالبًا ما تستخدم جنبًا إلى جنب مع Pandas، لذلك سنقوم باستيرادها أيضًا.
باستخدام هذا السطر الواحد، تكون قد فتحت القوة الكاملة لمكتبة Pandas. الآن، دعنا ننتقل إلى صلب هذا الدليل: إنشاء DataFrames.
طرق الإنشاء الأساسية: من البسيط إلى المعقد
إن مُنشئ pd.DataFrame() متعدد الاستخدامات بشكل لا يصدق. يمكنه قبول أنواع مختلفة من الإدخال. سوف نستكشف الآن أهم الطرق، والانتقال من الأكثر شيوعًا إلى الحالات الأكثر تخصصًا.
1. إنشاء DataFrame من قاموس قوائم أو مصفوفات
يمكن القول إن هذه هي الطريقة الأكثر شيوعًا وبديهية لإنشاء DataFrame. يمكنك البدء بقاموس Python حيث ستصبح المفاتيح أسماء الأعمدة، وستكون القيم عبارة عن قوائم (أو مصفوفات NumPy أو Pandas Series) تحتوي على بيانات لكل عمود.
كيف يعمل: تقوم Pandas بتعيين كل مفتاح قاموس إلى عنوان عمود وكل قائمة قيم إلى صفوف هذا العمود. الشرط الأساسي هنا هو أن يجب أن يكون لجميع القوائم نفس الطول، حيث تمثل كل قائمة عمودًا كاملاً من البيانات.
مثال:
لنقم بإنشاء DataFrame يحتوي على معلومات حول مدن مختلفة حول العالم.
# البيانات منظمة حسب العمود
city_data = {
'City': ['Tokyo', 'Delhi', 'Shanghai', 'São Paulo', 'Mumbai'],
'Country': ['Japan', 'India', 'China', 'Brazil', 'India'],
'Population_Millions': [37.3, 32.0, 28.5, 22.4, 20.9],
'Is_Coastal': [True, False, True, False, True]
}
# إنشاء DataFrame
df_from_dict = pd.DataFrame(city_data)
print(df_from_dict)
الإخراج:
City Country Population_Millions Is_Coastal
0 Tokyo Japan 37.3 True
1 Delhi India 32.0 False
2 Shanghai China 28.5 True
3 São Paulo Brazil 22.4 False
4 Mumbai India 20.9 True
الوجبات الرئيسية: هذه الطريقة مثالية عندما يتم تنظيم بياناتك بشكل طبيعي حسب الميزة أو الفئة. إنه نظيف وقابل للقراءة ويترجم بنية القاموس الخاص بك مباشرةً إلى تنسيق جدولي.
2. إنشاء DataFrame من قائمة القواميس
هناك طريقة بديلة وقوية بنفس القدر وهي استخدام قائمة حيث يكون كل عنصر عبارة عن قاموس. في هذا الهيكل، يمثل كل قاموس صفًا واحدًا، وتمثل مفاتيحه أسماء الأعمدة لبيانات هذا الصف.
كيف يعمل: تتكرر Pandas عبر القائمة. لكل قاموس، تقوم بإنشاء صف جديد. يتم استخدام مفاتيح القاموس لتحديد الأعمدة. هذه الطريقة مرنة بشكل لا يصدق لأنه إذا كان القاموس يفتقد مفتاحًا، فستقوم Pandas تلقائيًا بملء تلك الخلية في الصف المقابل بـ NaN (ليس رقمًا)، وهو العلامة القياسية للبيانات المفقودة في Pandas.
مثال:
دعنا نمثل نفس بيانات المدينة، ولكن هذه المرة منظمة كقائمة من السجلات.
# البيانات منظمة حسب الصف (السجل)
records_data = [
{'City': 'Tokyo', 'Country': 'Japan', 'Population_Millions': 37.3, 'Is_Coastal': True},
{'City': 'Delhi', 'Country': 'India', 'Population_Millions': 32.0, 'Is_Coastal': False},
{'City': 'Shanghai', 'Country': 'China', 'Population_Millions': 28.5},
{'City': 'São Paulo', 'Country': 'Brazil', 'Population_Millions': 22.4, 'Is_Coastal': False},
{'City': 'Cairo', 'Country': 'Egypt', 'Timezone': 'EET'} # لاحظ البنية المختلفة
]
# إنشاء DataFrame
df_from_list_of_dicts = pd.DataFrame(records_data)
print(df_from_list_of_dicts)
الإخراج:
City Country Population_Millions Is_Coastal Timezone
0 Tokyo Japan 37.3 True NaN
1 Delhi India 32.0 False NaN
2 Shanghai China 28.5 NaN NaN
3 São Paulo Brazil 22.4 False NaN
4 Cairo Egypt NaN NaN EET
لاحظ كيف تعاملت Pandas مع التناقضات بلطف. قيمة 'Is_Coastal' لشنغهاي هي NaN لأنها كانت مفقودة من قاموسها. تم إنشاء عمود 'Timezone' جديد للقاهرة، مع NaN لجميع المدن الأخرى. وهذا يجعله خيارًا ممتازًا للعمل مع البيانات شبه المهيكلة، مثل استجابات JSON من واجهات برمجة التطبيقات.
الوجبات الرئيسية: استخدم هذه الطريقة عندما تأتي بياناتك كسلسلة من السجلات أو الملاحظات. إنه قوي في التعامل مع البيانات المفقودة والاختلافات في هيكل السجلات.
3. إنشاء DataFrame من مصفوفة NumPy
بالنسبة للعاملين في مجال الحوسبة العلمية أو التعلم الآلي أو أي مجال يتضمن عمليات رقمية كثيفة، غالبًا ما تنشأ البيانات في مصفوفات NumPy. تم تصميم Pandas فوق NumPy، مما يجعل التكامل بين الاثنين سلسًا وفعالاً للغاية.
كيف يعمل: يمكنك تمرير مصفوفة NumPy ثنائية الأبعاد إلى مُنشئ pd.DataFrame(). بشكل افتراضي، ستقوم Pandas بإنشاء فهارس وأعمدة تعتمد على الأعداد الصحيحة. ومع ذلك، يمكنك (ويجب عليك) توفير تسميات ذات معنى باستخدام المعلمات index و columns.
مثال:
لنقم بإنشاء DataFrame من مصفوفة NumPy عشوائية تم إنشاؤها بحجم 5x4، تمثل قراءات المستشعر بمرور الوقت.
# إنشاء مصفوفة NumPy بحجم 5x4 ببيانات عشوائية
data_np = np.random.rand(5, 4)
# تحديد تسميات الأعمدة والفهرس
columns = ['Sensor_A', 'Sensor_B', 'Sensor_C', 'Sensor_D']
index = pd.to_datetime(['2023-10-27 10:00', '2023-10-27 10:01', '2023-10-27 10:02', '2023-10-27 10:03', '2023-10-27 10:04'])
# إنشاء DataFrame
df_from_numpy = pd.DataFrame(data=data_np, index=index, columns=columns)
print(df_from_numpy)
الإخراج (ستختلف أرقامك العشوائية):
Sensor_A Sensor_B Sensor_C Sensor_D
2023-10-27 10:00:00 0.123456 0.987654 0.555555 0.111111
2023-10-27 10:01:00 0.234567 0.876543 0.666666 0.222222
2023-10-27 10:02:00 0.345678 0.765432 0.777777 0.333333
2023-10-27 10:03:00 0.456789 0.654321 0.888888 0.444444
2023-10-27 10:04:00 0.567890 0.543210 0.999999 0.555555
في هذا المثال، قدمنا أيضًا ميزة قوية: استخدام DatetimeIndex لبيانات السلاسل الزمنية، والتي تفتح مجموعة واسعة من إمكانات التحليل المستندة إلى الوقت في Pandas.
الوجبات الرئيسية: هذه هي الطريقة الأكثر كفاءة في استخدام الذاكرة لإنشاء DataFrame من البيانات الرقمية المتجانسة. إنه الخيار القياسي عند التفاعل مع مكتبات مثل NumPy أو Scikit-learn أو TensorFlow.
4. إنشاء DataFrame من قائمة القوائم
تشبه هذه الطريقة من الناحية المفاهيمية الإنشاء من مصفوفة NumPy ولكنها تستخدم قوائم Python القياسية. إنها طريقة مباشرة لتحويل البيانات الجدولية المخزنة بتنسيق قائمة متداخلة.
كيف يعمل: يمكنك توفير قائمة حيث تمثل كل قائمة داخلية صفًا من البيانات. كما هو الحال مع مصفوفات NumPy، يوصى بشدة بتحديد أسماء الأعمدة عبر المعلمة columns للوضوح.
مثال:
# البيانات كقائمة من الصفوف
product_data = [
['P001', 'Laptop', 1200.00, 'Electronics'],
['P002', 'Mouse', 25.50, 'Electronics'],
['P003', 'Desk Chair', 150.75, 'Furniture'],
['P004', 'Keyboard', 75.00, 'Electronics']
]
# تحديد أسماء الأعمدة
column_names = ['ProductID', 'ProductName', 'Price_USD', 'Category']
# إنشاء DataFrame
df_from_list_of_lists = pd.DataFrame(product_data, columns=column_names)
print(df_from_list_of_lists)
الإخراج:
ProductID ProductName Price_USD Category 0 P001 Laptop 1200.00 Electronics 1 P002 Mouse 25.50 Electronics 2 P003 Desk Chair 150.75 Furniture 3 P004 Keyboard 75.00 Electronics
الوجبات الرئيسية: هذه طريقة بسيطة وفعالة عندما يتم تنظيم بياناتك بالفعل كقائمة من الصفوف، مثل عند القراءة من تنسيق ملف ليس له رؤوس.
التهيئة المتقدمة: تخصيص DataFrame الخاص بك
بالإضافة إلى توفير البيانات الأولية، يقدم مُنشئ pd.DataFrame() العديد من المعلمات للتحكم في بنية وخصائص DataFrame الجديد الخاص بك منذ لحظة إنشائه.
تحديد الفهرس
لقد رأينا بالفعل المعلمة `index` قيد التنفيذ. الفهرس هو جزء أساسي من DataFrame، حيث يوفر تسميات للصفوف المستخدمة لعمليات البحث السريع ومحاذاة البيانات والمزيد. على الرغم من أن Pandas توفر فهرسًا رقميًا افتراضيًا (0، 1، 2، ...)، إلا أن تعيين فهرس ذي معنى يمكن أن يجعل بياناتك أسهل في التعامل معها.
مثال: لنعد استخدام مثال قاموس القوائم الخاص بنا ولكن قم بتعيين عمود `City` كفهرس عند الإنشاء.
city_data = {
'Country': ['Japan', 'India', 'China', 'Brazil', 'India'],
'Population_Millions': [37.3, 32.0, 28.5, 22.4, 20.9],
'Is_Coastal': [True, False, True, False, True]
}
city_names = ['Tokyo', 'Delhi', 'Shanghai', 'São Paulo', 'Mumbai']
# إنشاء DataFrame بفهرس مخصص
df_with_index = pd.DataFrame(city_data, index=city_names)
print(df_with_index)
الإخراج:
Country Population_Millions Is_Coastal
Tokyo Japan 37.3 True
Delhi India 32.0 False
Shanghai China 28.5 True
São Paulo Brazil 22.4 False
Mumbai India 20.9 True
الآن، يمكنك الوصول إلى بيانات الصف باستخدام هذه التسميات ذات المعنى، على سبيل المثال، مع df_with_index.loc['Tokyo'].
التحكم في أنواع البيانات (`dtype`)
تعتبر Pandas جيدة جدًا في استنتاج أنواع البيانات (مثل التعرف على الأرقام والنصوص والقيم المنطقية). ومع ذلك، في بعض الأحيان تحتاج إلى فرض نوع بيانات معين لعمود لضمان كفاءة الذاكرة أو تمكين عمليات معينة. تمنحك المعلمة `dtype` هذا التحكم.
مثال: تخيل أن لدينا معرفات منتجات تبدو مثل الأرقام ولكن يجب التعامل معها كنص (سلاسل).
data = {
'ProductID': [101, 102, 103],
'Stock': [50, 75, 0]
}
# إنشاء DataFrame مع تحديد dtype لـ 'ProductID'
df_types = pd.DataFrame(data, dtype={'ProductID': str, 'Stock': 'int32'})
print(df_types.dtypes)
الإخراج:
ProductID object Stock int32 dtype: object
لاحظ أن `str` في Pandas يتم تمثيله كـ `object`. من خلال تعيين `dtype` بشكل صريح، فإننا نمنع Pandas من التعامل مع `ProductID` كرقم، مما قد يؤدي إلى حسابات غير صحيحة أو مشكلات في الفرز في المستقبل. يمكن أن يؤدي استخدام أنواع عدد صحيح أكثر تحديدًا مثل `int32` بدلاً من `int64` الافتراضي أيضًا إلى توفير ذاكرة كبيرة مع مجموعات البيانات الكبيرة.
سيناريوهات عملية وأفضل الممارسات
يعتمد اختيار طريقة الإنشاء الصحيحة على التنسيق الأصلي لبياناتك. فيما يلي دليل قرار بسيط:
- هل بياناتك في أعمدة (على سبيل المثال، قائمة واحدة لكل ميزة)؟ استخدم قاموس القوائم. إنه مناسب تمامًا.
- هل بياناتك عبارة عن سلسلة من السجلات (على سبيل المثال، من واجهة برمجة تطبيقات JSON)؟ استخدم قائمة القواميس. إنه يتفوق في التعامل مع الحقول المفقودة أو الإضافية في السجلات.
- هل بياناتك رقمية وفي شبكة (على سبيل المثال، من حساب علمي)؟ استخدم مصفوفة NumPy. إنه الخيار الأفضل أداءً لحالة الاستخدام هذه.
- هل بياناتك بتنسيق جدول بسيط صفًا تلو الآخر بدون رؤوس؟ استخدم قائمة القوائم وقم بتوفير أسماء الأعمدة بشكل منفصل.
المزالق الشائعة التي يجب تجنبها
- أطوال غير متساوية في قاموس القوائم: هذا خطأ شائع. عند إنشاء DataFrame من قاموس القوائم، يجب أن يكون لكل قائمة نفس العدد من العناصر تمامًا. إذا لم يكن الأمر كذلك، فستقوم Pandas بإظهار `ValueError`. تأكد دائمًا من أن بيانات العمود الخاص بك ذات طول متساوٍ قبل الإنشاء.
- تجاهل الفهرس: الاعتماد على الفهرس الافتراضي المستند إلى 0 جيد للعديد من الحالات، ولكن إذا كانت بياناتك تحتوي على معرف طبيعي (مثل معرف المنتج أو معرف المستخدم أو طابع زمني محدد)، فإن تعيينه كفهرس منذ البداية يمكن أن يبسط التعليمات البرمجية الخاصة بك لاحقًا.
- نسيان أنواع البيانات: ينجح السماح لـ Pandas باستنتاج الأنواع في معظم الأوقات، ولكن بالنسبة لمجموعات البيانات الكبيرة أو الأعمدة ذات الأنواع المختلطة، يمكن أن يعاني الأداء. كن استباقيًا بشأن تعيين `dtype` للأعمدة التي تحتاج إلى التعامل معها كفئات أو سلاسل أو أنواع رقمية محددة لتوفير الذاكرة ومنع الأخطاء.
ما وراء التهيئة: إنشاء DataFrames من الملفات
بينما يركز هذا الدليل على إنشاء DataFrames من كائنات Python الموجودة في الذاكرة، فمن الضروري معرفة أنه في غالبية السيناريوهات الواقعية، ستأتي بياناتك من ملف خارجي. توفر Pandas مجموعة من وظائف القراءة المحسّنة للغاية لهذا الغرض، بما في ذلك:
pd.read_csv(): لملفات القيم المفصولة بفواصل، وهي الركيزة الأساسية لاستيراد البيانات.pd.read_excel(): لقراءة البيانات من جداول بيانات Microsoft Excel.pd.read_json(): لقراءة البيانات من ملفات أو سلاسل JSON.pd.read_sql(): لقراءة نتائج استعلام قاعدة بيانات مباشرة في DataFrame.pd.read_parquet(): للقراءة من تنسيق ملف Parquet الفعال والموجه نحو الأعمدة.
هذه الوظائف هي الخطوة المنطقية التالية في رحلة Pandas الخاصة بك. سيسمح لك إتقانها باستيعاب البيانات من أي مصدر تقريبًا إلى هيكل DataFrame قوي.
الخلاصة: أساسك لإتقان البيانات
إن Pandas DataFrame هو هيكل البيانات المركزي لأي عمل بيانات جاد في Python. كما رأينا، تقدم Pandas مجموعة مرنة وبديهية من الأدوات لتهيئة هذه الهياكل من مجموعة واسعة من التنسيقات. من خلال فهم كيفية إنشاء DataFrame من القواميس والقوائم ومصفوفات NumPy، تكون قد بنيت أساسًا قويًا لمشاريع تحليل البيانات الخاصة بك.
المفتاح هو اختيار الطريقة التي تطابق بشكل أفضل البنية الأصلية لبياناتك. هذا لا يجعل التعليمات البرمجية الخاصة بك أنظف وأكثر قابلية للقراءة فحسب، بل يجعلها أيضًا أكثر كفاءة. من هنا، أنت على استعداد للانتقال إلى المهام المثيرة المتمثلة في تنظيف البيانات واستكشافها وتحويلها وتصورها. ترميز سعيد!