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`.

  • ๐Ÿ”˜ Satu panggilan: pd.read_csv() menerima jalur file, sebuah URL, atau objek apa pun yang mengekspos metode baca.
  • โ˜‘๏ธ Kontrol kolom: Berikan nama untuk memberi label pada kolom dan index_col=False untuk mempertahankan indeks bilangan bulat biasa.
  • โœ… Spasi putih: skipinitialspace=True menghapus spasi yang mengikuti setiap koma dalam dataset dewasa.
  • ๐Ÿงช Kelompokkan dan agregasikan: Fungsi groupby() merangkum frame dengan jumlah, nilai minimum, nilai maksimum, nilai rata-rata, nilai median, atau nilai standar deviasi.
  • ๏ธ File berukuran besar: usecols, dtype, dan chunksize mengurangi waktu parsing dan penggunaan memori pada ekspor data berukuran multi-gigabyte.
  • โš ๏ธ Kesalahan Umum: Pengkodean, baris yang buruk, dan tipe data campuran masing-masing memiliki argumen yang terdokumentasi untuk memperbaikinya.

Panda read_csv() dengan Contoh

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.

Bagan batang berkelompok yang menunjukkan rata-rata keuntungan modal berdasarkan label pendapatan dan status perkawinan.

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)

Pertanyaan Umum Demo Slot

Keduanya memanggil parser yang sama. read_csv() secara default menggunakan pemisah koma, sedangkan read_table() membaca file yang dipisahkan secara umum dan mengharuskan Anda untuk mengatur pemisah (sep) sendiri. Gunakan read_csv() untuk file yang dipisahkan koma dan read_table() untuk ekspor yang dipisahkan tab atau pipa.

Panggil df.to_csv('output.csv', index=False). Hapusping Indeks ini menghindari kolom pertama yang tidak bernama pada pembacaan berikutnya. Tambahkan argumen sep, encoding, atau compression untuk mencerminkan pengaturan apa pun yang Anda gunakan saat file diimpor.

Lewatkan parameter parse_dates dengan nama atau posisi kolom, dan tambahkan date_format jika tata letaknya bukan ISO 8601, misalnya date_format='%d/%m/%Y'. Tanpa itu, kolom tanggal akan diterima sebagai string objek biasa dan memerlukan panggilan to_datetime terpisah.

Atur `sep` ke karakter, misalnya `sep=';'` atau `sep='\t'`. Pemisah yang lebih panjang dari satu karakter diperlakukan sebagai ekspresi reguler dan memaksa proses yang lebih lambat. Python engine. sep=None memungkinkan mesin tersebut untuk mendeteksi pembatas dari baris valid pertama.

Gunakan nrows untuk membatasi jumlah baris data yang dikembalikan, dan skiprows untuk melompati blok baris awal. Menggabungkan keduanya akan melakukan paging pada sebuah file, misalnya skiprows=1000000 dengan nrows=999999 untuk membaca satu juta baris kedua.

Ya. Kompresi secara default menggunakan 'infer', jadi jalur yang berakhiran .gz, .zip, .bz2, .xz atau .zst akan didekompresi secara otomatis. URLs menggunakan http, ftp, s3, gs atau file semuanya berfungsi, dan storage_options meneruskan kredensial ke backend jarak jauh.

Model terlatih menandai kemungkinan kesalahan tipe, mengelompokkan ejaan kategori yang hampir duplikat, dan mengimputasi nilai yang hilang dari kolom di sekitarnya. Hal itu mempersempit pembersihan manual ke baris yang tidak dapat diselesaikan oleh pengaturan na_values โ€‹โ€‹atau dtype berbasis aturan.

Copilot membuat draf boilerplate dengan cepat begitu dapat melihat contoh file. Perlakukan daftar argumen sebagai draf, karena sering kali menebak dtype dan encoding. Periksa setiap kata kunci yang dihasilkan terhadap referensi API pandas sebelum menjalankannya.

Ringkaslah postingan ini dengan: