دالة read_csv() في مكتبة Pandas Python مع المثال
⚡ ملخص ذكي
تقوم دالة read_csv() في مكتبة Pandas بتحويل ملف مفصول بفواصل، سواء كان محليًا أو عن بُعد، إلى DataFrame في استدعاء واحد. يشرح هذا الدليل كيفية استيراد مجموعة بيانات تعداد السكان البالغين من جامعة كاليفورنيا في إرفاين، وتسمية أعمدتها الخمسة عشر، وتلخيص النتيجة باستخدام تجميعات groupby.
استيراد CSV في الباندا
خلال البرنامج التعليمي لـ TensorFlow، ستستخدم مجموعة بيانات البالغينوهو ما يُستخدم غالبًا في مهام التصنيف. الملف المستخدم أدناه هو الملف الخام. adult.data يمكنك تصدير البيانات من مستودع UCI للتعلم الآلي، كما توفر صفحة مجموعة البيانات أيضًا تنزيلًا مضغوطًا و ucimlrepo قم بتعطيل الحزمة إذا توقف المسار المباشر عن العمل.
يتم تخزين البيانات بصيغة CSV. تتضمن مجموعة البيانات 8 متغيرات تصنيفية:
- فئة العمل
- التعليم
- الزوجي
- احتلال
- صلة
- سباق
- جنس
- الوطن الأم
وستة متغيرات مستمرة:
- السن
- com.fnlwgt
- education_num
- مكاسب رأس المال
- خسارة رأس المال
- ساعات_الاسبوع
بالإضافة إلى الدخل label العمود، وهذا يُشكّل أسماء الأعمدة الخمسة عشر التي ستمررها إلى الباندا في القسم التالي.
طريقة الباندا read_csv ().
لاستيراد مجموعة بيانات CSV، يمكنك استخدام الكائن pd.read_csv(). التوقيع الأساسي هو:
الباندا read_csv () بناء الجملة
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- مسار الملف أو المخزن المؤقت: طريق، URLأو كائن يشبه الملف يحتوي على البيانات
- sep=',': الفاصل المراد استخدامه
- الأسماء = لا شيءقم بتسمية الأعمدة. إذا كانت مجموعة البيانات تحتوي على عشرة أعمدة، فيجب عليك تمرير عشرة أسماء.
- index_col=Noneحدد العمود الذي سيتم استخدامه كمؤشر للصف. مرر القيمة False لفرض استخدام مؤشر عددي جديد.
- skipinitialspace=False: تجاهل المسافات بعد الفاصل
للاطلاع على القائمة الكاملة للحجج، راجع الموقع الرسمي توثيق دالة pandas.read_csv().
الباندا read_csv () مثال
يُحدد المقتطف أدناه جميع الأعمدة الـ 15، ويشير إلى ملف UCI، ويزيل المسافة التي تلي كل فاصلة في مجموعة البيانات هذه.
## Import csv import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train.shape
الإخراج:
(32561, 15)
يؤكد الشكل وجود 32,561 صفًا و15 عمودًا، لذلك تمت مطابقة كل اسم في COLUMNS مع حقل في الملف.
مفتاح معلمات دالة read_csv() في Pandas
تقبل الدالة read_csv() أكثر من خمسين وسيطًا، لكن مجموعة صغيرة منها تغطي تقريبًا جميع عمليات الاستيراد الأساسية. القيم الافتراضية المذكورة أدناه هي تلك الموثقة في مرجع واجهة برمجة تطبيقات Pandas الحالي.
| معامل | الترتيب | ماذا يفعل |
| سبتمبر | '،' | يُستخدم الحرف أو التعبير النمطي كفاصل. استخدم sep=';' أو sep='\t' للتنسيقات الأخرى. |
| رأس | 'استدلال' | رقم الصف الذي يحتوي على عناوين الأعمدة. مرر header=None عندما لا يحتوي الملف على صف عناوين. |
| الأسماء | غير مضبوط | قائمة صريحة لعناوين الأعمدة. استخدمها مع header=0 لاستبدال عنوان موجود. |
| index_col | بدون سلوفان | العمود المراد استخدامه كمؤشر للصف. يؤدي تعيين index_col=False إلى فرض استخدام مؤشر عدد صحيح عادي. |
| استخدام الأعمدة | بدون سلوفان | مجموعة فرعية من الأعمدة المراد تحميلها، حسب التسمية أو الموضع. يقلل ذلك من وقت التحليل والذاكرة. |
| dtype | بدون سلوفان | أنواع البيانات لكل عمود، على سبيل المثال {'age': 'int32'}. يتجاوز استنتاج النوع. |
| القيم المفقودة | بدون سلوفان | سلاسل إضافية لقراءتها كـ NaN، مثل العنصر النائب '؟' في مجموعة بيانات البالغين. |
| skiprows / nrows | بدون سلوفان | تجاهل الأسطر الأولى، أو اقرأ أول N صف من البيانات فقط. |
| parse_dates | بدون سلوفان | الأعمدة المراد تحويلها إلى التاريخ والوقت أثناء القراءة، مقترنة بتنسيق التاريخ. |
| ترميز | 'utf-8' | ترميز نص الملف. استخدم 'latin-1' أو 'cp1252' للتصديرات القديمة. |
| حجم قطعة | بدون سلوفان | أعد مُكرِّرًا يُنتج الملف في كتل من N صفًا. |
| على الخطوط السيئة | 'خطأ' | ماذا نفعل مع الصفوف المشوهة: نرفعها، أو نحذر منها، أو نتجاهلها. |
اثنان من هذه الأمور يستحقان التنويه. index_col=False لا يُعدّ هذا مماثلاً لتركه دون تعيين: فهو يُخبر Pandas صراحةً بعدم ترقية العمود الأول، وهو ما تريده عندما ينتهي كل سطر في الملف بفاصلة زائدة. names يقوم هذا الإجراء بالكتابة فوق أي شيء يُعلن عنه الملف دون علمك، لذا مرر. header=0 بجانبها عندما يحتوي ملف CSV بالفعل على صف عناوين.
طريقة مجموعة الباندا ().
إحدى أسهل الطرق لعرض البيانات هي استخدام دالة التجميع (groupby). تساعدك هذه الدالة على تلخيص البيانات حسب المجموعة. فيما يلي قائمة بالتجميعات المتاحة باستخدام دالة التجميع (groupby):
- عد : عد
- دقيقة: دقيقة
- الحد الأقصى: الحد الأقصى
- يعني يعني
- متوسط: متوسط
- الانحراف المعياري: std
- و اخرين
داخل الدالة groupby()، تقوم بتسمية العمود الذي تريد التجميع بناءً عليه قبل تطبيق التجميع.
دعونا نلقي نظرة على مجموعة واحدةping باستخدام مجموعة بيانات البالغين. ستحصل على متوسط جميع المتغيرات المستمرة حسب نوع الإيرادات، أي أعلى من 50 ألفًا أو أقل من 50 ألفًا:
df_train.groupby(['label']).mean()
| ملصق | السن | com.fnlwgt | education_num | مكاسب رأس المال | خسارة رأس المال | ساعات_الاسبوع |
| <= 50 ألف | 36.783738 | 190340.86517 | 9.595065 | 148.752468 | 53.142921 | 38.840210 |
| > 50K | 44.249841 | 188005.00000 | 11.611657 | 4006.142456 | 195.001530 | 45.473026 |
يمكنك معرفة الحد الأدنى للسن حسب نوع الأسرة:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
يمكنك أيضًا التجميع حسب عدة أعمدة. على سبيل المثال، يمكنك الحصول على أقصى مكسب رأسمالي وفقًا لنوع الأسرة والحالة الاجتماعية.
df_train.groupby(['label', 'marital'])['capital_gain'].max() label marital <=50K Divorced 34095 Married-AF-spouse 2653 Married-civ-spouse 41310 Married-spouse-absent 6849 Never-married 34095 Separated 7443 Widowed 6849 >50K Divorced 99999 Married-AF-spouse 7298 Married-civ-spouse 99999 Married-spouse-absent 99999 Never-married 99999 Separated 99999 Widowed 99999 Name: capital_gain, dtype: int64
يمكنك إنشاء رسم بياني بعد عملية التجميع. إحدى طرق القيام بذلك هي رسم النتيجة المجمعة مباشرةً.
للحصول على رسم بياني أوضح، استخدم دالة unstack() بعد دالة mean() بحيث تنتقل الحالة الاجتماعية من الفهرس إلى الأعمدة. سيحتوي الرسم البياني حينها على مجموعتين، واحدة لكل فئة دخل، بدلاً من أربعة عشر شريطًا (2 × 7) ينتجها فهرس متعدد المستويات مسطح.
إذا كنت تستخدم Jupyter دفترتذكر إضافة %matplotlib inline، وإلا فلن يتم عرض أي رسم بياني.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
رسم هذا الإطار غير المكدس كمخطط شريطي يعطي الشكل أدناه.
كيفية قراءة ملفات CSV كبيرة الحجم باستخدام مكتبة Pandas
مجموعة بيانات البالغين صغيرة، لكن نفس الاستدعاء قد يتعطل عند تصدير بيانات بحجم عدة غيغابايت. ثلاثة وسائط تقوم بمعظم العمل.
- استخدام الأعمدة لا يتم تحميل سوى الأعمدة التي تحتاجها فعليًا. تشير وثائق Pandas إلى أن هذا يؤدي إلى تحليل أسرع بكثير واستهلاك أقل للذاكرة.
- dtype يقوم بتثبيت كل عمود على نوع معين، لذلك يتخطى Pandas الاستدلال ولا يقوم بتوسيع الأعداد الصحيحة إلى 64 بت بشكل افتراضي.
- حجم قطعة يقوم بإرجاع TextFileReader بدلاً من DataFrame، مما يسمح لك بالتكرار على كتل من N صفوف وتجميعها أثناء تقدمك.
import pandas as pd # read only the columns you need, with explicit types cols = ['age', 'education', 'capital_gain', 'label'] types = {'age': 'int32', 'capital_gain': 'int32'} df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types, skipinitialspace=True, index_col=False) # stream the file in fixed-size chunks instead of loading it whole total = 0 for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000, skipinitialspace=True, index_col=False): total = total + len(chunk) print(total)
هناك خياران إضافيان يساعدان بمجرد وضع الأساسيات. engine='pyarrow' يتحول إلى محلل Arrow متعدد الخيوط، و dtype_backend='pyarrow' يحتفظ بالنتيجة في أعمدة مدعومة بأسهم. low_memory يتم تعيين القيمة الافتراضية إلى True، مما يؤدي إلى تحليل الملف داخليًا على أجزاء، ولكن يمكن أن ينتج أنواعًا مختلطة في عمود واحد؛ قم بتعيين نوع بيانات صريح بدلاً من الاعتماد عليه.
وفي الختام compression='infer' يعني ذلك أن المسار الذي ينتهي بـ .gz أو .zip أو .bz2 أو .xz أو .zst يتم فك ضغطه أثناء التشغيل، لذلك لا حاجة لفك ضغط الأرشيف قبل قراءته.
أخطاء شائعة في دالة read_csv() في مكتبة Pandas وكيفية إصلاحها
معظم حالات فشل الدالة read_csv() تأتي من أربعة أسباب، ولكل منها وسيط موثق لحلها.
| خطأ | سبب | حل |
| خطأ في الملف | المسار نسبي إلى دليل العمل، وليس إلى البرنامج النصي. | استخدم مسارًا مطلقًا، أو قم بتأكيد URL المخطط هو أحد الخيارات التالية: http، ftp، s3، gs أو file. |
| خطأ في فك ترميز Unicode | الملف ليس بتنسيق UTF-8، وهو التنسيق الافتراضي. | قم بتمرير encoding='latin-1' أو برنامج الترميز الصحيح، أو encoding_errors='replace'. |
| خطأ في التحليل: خطأ في تجزئة البيانات | يحتوي الصف على حقول أكثر مما هو مُعلن في رأس الجدول. | قم بتمرير on_bad_lines='skip' أو 'warn'، أو قم بتعيين الفاصل الصحيح. |
| تحذير نوع البيانات: تحتوي الأعمدة على أنواع بيانات مختلطة | أظهر استنتاج النوع المجزأ أنواعًا مختلفة في عمود واحد. | قم بتعيين نوع البيانات بشكل صريح، أو low_memory=False. |
| تم تحريك الأعمدة بمقدار واحد | يؤدي وجود فاصل في نهاية الحقل إلى قيام مكتبة Pandas بترقية الحقل الأول إلى الفهرس. | مرر قيمة index_col=False. |
تُظهر مجموعة بيانات البالغين حالة القيم المفقودة بشكل مباشر: يتم تخزين إدخالات فئة العمل والمهنة والبلد الأصلي غير المعروفة كعلامة استفهام حرفية، لذا تصل كسلسلة '؟' ما لم تقم بتعريفها.
# tolerate rows with too many fields instead of raising df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip') # read a file that is not UTF-8 df = pd.read_csv('sales.csv', encoding='latin-1') # treat the dataset's '?' placeholder as a missing value df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

