دالة read_csv() في مكتبة Pandas Python مع المثال

⚡ ملخص ذكي

تقوم دالة read_csv() في مكتبة Pandas بتحويل ملف مفصول بفواصل، سواء كان محليًا أو عن بُعد، إلى DataFrame في استدعاء واحد. يشرح هذا الدليل كيفية استيراد مجموعة بيانات تعداد السكان البالغين من جامعة كاليفورنيا في إرفاين، وتسمية أعمدتها الخمسة عشر، وتلخيص النتيجة باستخدام تجميعات groupby.

  • 🔘 مكالمة واحدة: تقبل الدالة pd.read_csv() مسار ملف، و URLأو أي كائن يعرض طريقة قراءة.
  • ☑️ التحكم في الأعمدة: قم بتمرير أسماء لتسمية الأعمدة وقم بتعيين index_col=False للاحتفاظ بفهرس عدد صحيح عادي.
  • مسافة بيضاء: skipinitialspace=True يزيل المسافة التي تلي كل فاصلة في مجموعة بيانات البالغين.
  • 🧪 التجميع والدمج: تقوم الدالة groupby() بتلخيص الإطار باستخدام count أو min أو max أو mean أو median أو std.
  • 🛠️ الملفات الكبيرة: تعمل خيارات usecols و dtype و chunksize على تقليل وقت التحليل والذاكرة في عمليات التصدير متعددة الجيجابايت.
  • ⚠️ الأخطاء الشائعة: يحتوي كل من التشفير والأسطر السيئة وأنواع البيانات المختلطة على وسيطة موثقة تعمل على إصلاحها.

الباندا read_csv () مع مثال

استيراد 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)

الأسئلة الشائعة

كلاهما يستدعي نفس المحلل اللغوي. تستخدم الدالة read_csv() الفاصلة كفاصل افتراضي، بينما تقرأ الدالة read_table() ملفًا مفصولًا بفواصل عامة وتتوقع منك تحديد الفاصل بنفسك. استخدم الدالة read_csv() للملفات المفصولة بفواصل، والدالة read_table() للملفات المفصولة بعلامات الجدولة أو الأنابيب.

استدعاء df.to_csv('output.csv', index=False). حذفping يتجنب الفهرس وجود عمود أول غير مسمى في القراءة التالية. أضف وسيطات sep أو encoding أو compression لمطابقة الإعدادات التي استخدمتها عند استيراد الملف.

مرر دالة parse_dates مع أسماء الأعمدة أو مواقعها، وأضف دالة date_format عندما لا يكون التنسيق ISO 8601، على سبيل المثال date_format='%d/%m/%Y'. بدونها، ستصل أعمدة التاريخ كسلاسل نصية عادية وتحتاج إلى استدعاء دالة to_datetime منفصلة.

قم بتعيين قيمة sep إلى الحرف، مثل sep=';' أو sep='\t'. تُعامل الفواصل الأطول من حرف واحد كتعابير نمطية وتفرض عملية أبطأ. Python يُتيح الخيار engine.sep=None لهذا المحرك اكتشاف الفاصل من الصف الأول الصالح.

استخدم nrows لتحديد الحد الأقصى لعدد صفوف البيانات المُسترجعة، وskiprows لتجاوز مجموعة من الأسطر الأولى. يمكنك دمجهما لتصفح صفحات الملف، على سبيل المثال skiprows=1000000 مع nrows=999999 لقراءة المليون صف الثاني.

نعم. يتم ضبط الضغط افتراضيًا على "الاستدلال"، لذلك يتم فك ضغط المسار الذي ينتهي بـ .gz أو .zip أو .bz2 أو .xz أو .zst تلقائيًا. URLتعمل جميع طرق الاتصال مثل http و ftp و s3 و gs أو file، ويقوم storage_options بتمرير بيانات الاعتماد إلى الواجهة الخلفية البعيدة.

تُشير النماذج المُدرَّبة إلى الأخطاء المحتملة في أنواع البيانات، وتُجمِّع التهجئات المُتشابهة للفئات، وتُكمل القيم المفقودة من الأعمدة المُحيطة. هذا يُقلِّل من الحاجة إلى التنظيف اليدوي ليقتصر على الصفوف التي لا يُمكن لقواعد na_values ​​أو dtype حلّها بمفردها.

يقوم Copilot بإنشاء الكود الأساسي بسرعة بمجرد أن يتمكن من رؤية عينة من الملف. تعامل مع قائمة الوسائط كمسودة، لأنه غالبًا ما يخمن نوع البيانات والترميز. تحقق من كل كلمة مفتاحية مُولّدة مقابل مرجع واجهة برمجة تطبيقات Pandas قبل تشغيلها.

تلخيص هذه التدوينة بـ: