Pandas read_csv() di Python dengan Contoh
โก Ringkasan Cerdas
Fungsi `read_csv()` Pandas mengubah file yang dipisahkan koma, baik lokal maupun jarak jauh, menjadi DataFrame dalam satu kali panggilan. Panduan ini mengimpor dataset sensus dewasa UCI, memberi nama lima belas kolomnya, dan meringkas hasilnya dengan agregasi `groupby`.
Impor CSV di Pandas
Selama tutorial TensorFlow, Anda akan menggunakan kumpulan data dewasa, yang sering digunakan untuk tugas klasifikasi. File yang digunakan di bawah ini adalah file mentah. adult.data Ekspor dari UCI Machine Learning Repository, dan halaman dataset juga menawarkan unduhan terkompresi (zipped) dan ucimlrepo paket jika jalur langsung berhenti berfungsi.
Data disimpan dalam format CSV. Dataset ini mencakup 8 variabel kategorikal:
- kelas kerja
- pendidikan
- perkawinan
- pekerjaan
- hubungan
- ras
- seks
- negara Asal
Dan 6 variabel kontinu:
- usia
- fnlwgt
- pendidikan_num
- keuntungan dalam bentuk uang
- modal_rugi
- jam_minggu
Bersama dengan pendapatan label kolom, yang menghasilkan 15 nama kolom yang akan Anda teruskan ke Panda di bagian selanjutnya.
Metode panda read_csv()
Untuk mengimpor dataset CSV, Anda dapat menggunakan objek pd.read_csv(). Tanda tangan dasarnya adalah:
Sintaks panda read_csv()
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- jalur_file_atau_buffer: jalur, URLatau objek mirip berkas yang menyimpan data.
- sep=',': pembatas yang akan digunakan
- nama=Tidak adaBeri nama kolom-kolom tersebut. Jika dataset memiliki sepuluh kolom, Anda perlu memberikan sepuluh nama.
- indeks_kolom=Tidak ada: kolom mana yang akan digunakan sebagai indeks baris. Berikan nilai False untuk memaksa penggunaan indeks bilangan bulat baru.
- skipinitialspace=FalseLewati spasi setelah pembatas.
Untuk daftar argumen selengkapnya, periksa situs resmi. dokumentasi pandas.read_csv().
Contoh panda read_csv()
Cuplikan di bawah ini menyebutkan semua 15 kolom, menunjuk ke file UCI, dan menghilangkan spasi yang mengikuti setiap koma dalam dataset khusus ini.
## 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
Keluaran:
(32561, 15)
Bentuk tersebut mengkonfirmasi 32,561 baris dan 15 kolom, jadi setiap nama dalam COLUMNS dicocokkan dengan sebuah field dalam file tersebut.
Parameter Utama Pandas read_csv()
Fungsi read_csv() menerima lebih dari lima puluh argumen, tetapi sebagian kecil mencakup hampir semua impor yang umum. Nilai default di bawah ini adalah yang didokumentasikan dalam referensi API pandas saat ini.
| Parameter | Default | Apa yang dilakukannya |
| September | ',' | Karakter atau regex yang digunakan sebagai pembatas. Gunakan sep=';' atau sep='\t' untuk format lain. |
| Header | 'menyimpulkan' | Nomor baris yang memuat label kolom. Lewatkan header=None jika file tidak memiliki baris header. |
| nama | tidak diatur | Daftar eksplisit label kolom. Gabungkan dengan header=0 untuk mengganti header yang sudah ada. |
| indeks_kolom | None | Kolom yang akan digunakan sebagai indeks baris. index_col=False memaksa penggunaan indeks bilangan bulat biasa. |
| gunakan kolom | None | Subset kolom yang akan dimuat, berdasarkan label atau posisi. Mengurangi waktu parsing dan penggunaan memori. |
| tipe d | None | Tipe data per kolom, misalnya {'age': 'int32'}. Melewati inferensi tipe. |
| nilai_na | None | String tambahan yang dibaca sebagai NaN, seperti placeholder '?' dalam dataset dewasa. |
| baris lewati / tidak ada baris | None | Lewati baris-baris awal, atau baca hanya N baris data pertama. |
| mengurai_tanggal | None | Kolom yang akan dikonversi ke format tanggal dan waktu saat membaca, dipasangkan dengan date_format. |
| encoding | 'utf-8' | Pengkodean teks file. Gunakan 'latin-1' atau 'cp1252' untuk ekspor lama. |
| ukuran potongan | None | Mengembalikan iterator yang menghasilkan file dalam blok yang terdiri dari N baris. |
| pada_jalur_buruk | 'kesalahan' | Apa yang harus dilakukan dengan baris yang bentuknya tidak normal: menaikkan, memberi peringatan, atau melewatinya. |
Dua di antaranya perlu dicatat. index_col=False tidak sama dengan membiarkannya tidak diatur: ini secara eksplisit memberi tahu Pandas untuk tidak mempromosikan kolom pertama, yang Anda inginkan ketika sebuah file mengakhiri setiap baris dengan pembatas yang tidak diinginkan. Dan names secara diam-diam menimpa apa pun yang dideklarasikan dalam file, jadi lewati header=0 di sampingnya ketika file CSV tersebut benar-benar memiliki baris header.
Metode Pandas groupby()
Cara mudah untuk melihat data adalah dengan menggunakan metode groupby. Metode ini dapat membantu Anda meringkas data berdasarkan grup. Berikut adalah daftar agregasi yang tersedia dengan metode groupby():
- menghitung: menghitung
- menit: menit
- maks: maks
- maksud: maksudnya
- median: median
- simpangan baku: std
- dan lain-lain
Di dalam fungsi groupby(), Anda menentukan kolom yang ingin Anda gunakan untuk pengelompokan sebelum menerapkan agregasi.
Mari kita lihat satu kelompok saja.ping dengan dataset orang dewasa. Anda akan mendapatkan nilai rata-rata dari semua variabel kontinu berdasarkan jenis pendapatan, yaitu di atas 50 ribu atau di bawah 50 ribu:
df_train.groupby(['label']).mean()
| label | usia | fnlwgt | pendidikan_num | keuntungan dalam bentuk uang | modal_rugi | jam_minggu |
| <= 50K | 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 |
Anda bisa mendapatkan usia minimum berdasarkan jenis rumah tangga:
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
Anda juga dapat mengelompokkan berdasarkan beberapa kolom. Misalnya, Anda bisa mendapatkan keuntungan modal maksimal menurut jenis rumah tangga dan status perkawinan.
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
Anda dapat membuat plot setelah melakukan pengelompokan (groupby). Salah satu caranya adalah dengan memplot hasil pengelompokan secara langsung.
Untuk membuat plot yang lebih jelas, terapkan unstack() setelah mean() sehingga status perkawinan berpindah dari indeks ke kolom. Grafik kemudian memiliki dua kelompok, satu per label pendapatan, alih-alih empat belas (2*7) batang yang akan dihasilkan oleh indeks multilevel datar.
Jika Anda menggunakan Jupyter buku catatanIngat untuk menambahkan %matplotlib secara inline, jika tidak, plot tidak akan ditampilkan.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Jika bingkai yang tidak ditumpuk tersebut diplot sebagai grafik batang, akan menghasilkan gambar di bawah ini.
Cara Membaca File CSV Berukuran Besar dengan Pandas
Dataset untuk orang dewasa berukuran kecil, tetapi panggilan yang sama dapat macet pada ekspor multi-gigabyte. Tiga argumen melakukan sebagian besar pekerjaan.
- gunakan kolom Pandas hanya memuat kolom yang benar-benar Anda butuhkan. Dokumentasi pandas mencatat bahwa ini menghasilkan parsing yang jauh lebih cepat dan penggunaan memori yang lebih rendah.
- tipe d Pandas menetapkan tipe data untuk setiap kolom, sehingga melewati proses inferensi dan tidak memperluas bilangan bulat menjadi 64-bit secara default.
- ukuran potongan Mengembalikan TextFileReader alih-alih DataFrame, memungkinkan Anda untuk melakukan perulangan pada blok berisi N baris dan melakukan agregasi saat proses berlangsung.
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)
Dua opsi tambahan akan membantu setelah hal-hal mendasar sudah terpenuhi. engine='pyarrow' beralih ke parser Arrow multithreaded, dan dtype_backend='pyarrow' menyimpan hasilnya dalam kolom yang diapit tanda panah. low_memory Secara default bernilai True, yang akan mengurai file secara internal dalam beberapa bagian, tetapi dapat menghasilkan tipe data campuran dalam satu kolom; tetapkan dtype secara eksplisit daripada mengandalkannya.
Terakhir, compression='infer' Artinya, jalur yang berakhiran .gz, .zip, .bz2, .xz, atau .zst akan didekompresi secara langsung, sehingga tidak perlu membongkar arsip sebelum membacanya.
Kesalahan Umum pada Pandas read_csv() dan Cara Memperbaikinya
Sebagian besar kegagalan read_csv() berasal dari empat penyebab, dan masing-masing memiliki argumen yang terdokumentasi untuk mengatasinya.
| error | Menyebabkan | Memperbaiki |
| FileNotFoundError | Jalur tersebut relatif terhadap direktori kerja, bukan terhadap skrip. | Gunakan jalur absolut, atau konfirmasikan URL Skema yang digunakan adalah salah satu dari http, ftp, s3, gs, atau file. |
| UnicodeDecodeError | File tersebut bukan UTF-8, yang merupakan pengkodean default. | Lewatkan encoding='latin-1' atau codec yang benar, atau encoding_errors='replace'. |
| ParserError: Kesalahan saat melakukan tokenisasi data | Satu baris memuat lebih banyak kolom daripada yang dinyatakan dalam judul kolom. | Lewatkan on_bad_lines='skip' atau 'warn', atau atur sep yang benar. |
| DtypeWarning: kolom memiliki tipe data campuran | Inferensi tipe terpotong melihat berbagai tipe dalam satu kolom. | Tetapkan dtype secara eksplisit, atau low_memory=False. |
| Kolom digeser satu | Pembatas di akhir membuat Pandas mempromosikan kolom pertama ke indeks. | Lewatkan index_col=False. |
Dataset dewasa menunjukkan kasus nilai yang hilang secara langsung: entri workclass, occupation, dan native_country yang tidak diketahui disimpan sebagai tanda tanya literal, sehingga muncul sebagai string '?' kecuali Anda mendeklarasikannya.
# 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)

