Impor file CSV sebagai DataFrame pandas

91

Apa cara Python untuk membaca dalam file CSV menjadi pandas DataFrame (yang kemudian dapat saya gunakan untuk operasi statistik, dapat memiliki kolom dengan tipe berbeda, dll.)?

File CSV saya "value.txt"memiliki konten berikut:

Date,"price","factor_1","factor_2"
2012-06-11,1600.20,1.255,1.548
2012-06-12,1610.02,1.258,1.554
2012-06-13,1618.07,1.249,1.552
2012-06-14,1624.40,1.253,1.556
2012-06-15,1626.15,1.258,1.552
2012-06-16,1626.15,1.263,1.558
2012-06-17,1626.15,1.264,1.572

Di R kita akan membaca file ini dengan menggunakan:

price <- read.csv("value.txt")  

dan itu akan mengembalikan R data.frame:

> price <- read.csv("value.txt")
> price
     Date   price factor_1 factor_2
1  2012-06-11 1600.20    1.255    1.548
2  2012-06-12 1610.02    1.258    1.554
3  2012-06-13 1618.07    1.249    1.552
4  2012-06-14 1624.40    1.253    1.556
5  2012-06-15 1626.15    1.258    1.552
6  2012-06-16 1626.15    1.263    1.558
7  2012-06-17 1626.15    1.264    1.572

Apakah ada cara Pythonic untuk mendapatkan fungsi yang sama?

mazlor.dll
sumber
Akankah Anda memuji apa yang spesial dari dataframe dan operasi statistik apa yang dapat Anda lakukan dengannya?
LWZ
3
dataframe dapat berisi lebih dari satu jenis data, misalnya setiap kolom dapat berupa daftar, dan Anda dapat memperlakukan setiap daftar secara individual dengan menerapkan beberapa fungsi di dalamnya, dan berbicara tentang operasi statistik, seperti memiliki mean, deviasi standar, kuartil,. ..
mazlor
Terima kasih! Ini sebenarnya sangat berguna bagi saya. Saya selalu memuat file csv dengan modul csv yang memberi saya daftar daftar. Data.frame ini terdengar jauh lebih baik!
LWZ
@LWZ: lihat suntingan dan tautan saya, lmk jika itu menjawab pertanyaan Anda dengan ringkas. Hanya itu yang bisa kita lakukan di sini untuk 'menjual' paket manfaat. Pertanyaan yang lebih luas "Apa keuntungan menggunakan pandas dataframe dibandingkan array / list-of-list Python biasa?" memiliki banyak manfaat, terlalu banyak untuk
smci

Jawaban:

160

panda untuk menyelamatkan:

import pandas as pd
print pd.read_csv('value.txt')

        Date    price  factor_1  factor_2
0  2012-06-11  1600.20     1.255     1.548
1  2012-06-12  1610.02     1.258     1.554
2  2012-06-13  1618.07     1.249     1.552
3  2012-06-14  1624.40     1.253     1.556
4  2012-06-15  1626.15     1.258     1.552
5  2012-06-16  1626.15     1.263     1.558
6  2012-06-17  1626.15     1.264     1.572

Ini mengembalikan DataFrame pandas yang mirip dengan R's.

akar
sumber
11

Untuk membaca file CSV sebagai DataFrame pandas, Anda harus menggunakan pd.read_csv.

Tapi ini bukanlah akhir cerita; data ada dalam berbagai format dan disimpan dengan cara yang berbeda sehingga Anda akan sering perlu meneruskan parameter tambahan read_csvuntuk memastikan data Anda terbaca dengan benar.

Berikut adalah tabel yang mencantumkan skenario umum yang dihadapi dengan file CSV bersama dengan argumen yang sesuai yang perlu Anda gunakan. Anda biasanya memerlukan semua atau beberapa kombinasi dari argumen di bawah ini untuk membaca data Anda .

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  ScenarioArgumentExample                                               │
├──────────────────────────────────────────────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────┤
│  Read CSV with different separator¹                      │  sep/delimiter              │  read_csv(..., sep=';')                                │
│  Read CSV with tab/whitespace separator                  │  delim_whitespace           │  read_csv(..., delim_whitespace=True)                  │
│  Fix UnicodeDecodeError while reading²                   │  encoding                   │  read_csv(..., encoding='latin-1')                     │
│  Read CSV without headers³                               │  header and names           │  read_csv(..., header=False, names=['x', 'y', 'z'])    │
│  Specify which column to set as the index⁴               │  index_col                  │  read_csv(..., index_col=[0])                          │
│  Read subset of columns                                  │  usecols                    │  read_csv(..., usecols=['x', 'y'])                     │
│  Numeric data is in European format (eg., 1.234,56)      │  thousands and decimal      │  read_csv(..., thousands='.', decimal=',')             │
└──────────────────────────────────────────────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────┘

Catatan kaki

  1. Secara default, read_csvmenggunakan mesin parser C untuk kinerja. Parser C hanya dapat menangani pemisah karakter tunggal. Jika CSV Anda memiliki pemisah multi-karakter, Anda perlu mengubah kode Anda untuk menggunakan 'python'mesin. Anda juga bisa meneruskan ekspresi reguler:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorterjadi ketika data disimpan dalam satu format pengkodean tetapi dibaca dalam format lain yang tidak kompatibel. Skema encoding yang paling umum adalah 'utf-8'dan 'latin-1', data Anda kemungkinan besar cocok dengan salah satunya.

  3. header=Falsemenentukan bahwa baris pertama di CSV adalah baris data dan bukan baris header, dan names=[...]memungkinkan Anda untuk menentukan daftar nama kolom untuk ditetapkan ke DataFrame saat dibuat.

  4. "Tanpa nama: 0" terjadi ketika DataFrame dengan indeks tanpa nama disimpan ke CSV dan kemudian dibaca kembali setelahnya. Alih-alih harus memperbaiki masalah saat membaca, Anda juga dapat memperbaiki masalah saat menulis dengan menggunakan

    df.to_csv(..., index=False)
    

Ada argumen lain yang tidak saya sebutkan di sini, tetapi ini adalah yang paling sering Anda temui.

cs95
sumber
1
Bisakah Anda menempel ulang / memformat ulang tabel-sebagai-gambar sebagai teks Unicode menggunakan misalnya ozh.github.io/ascii-tables ? Jika tidak, maka akan sulit dibaca, dan tidak akan diindeks untuk pencarian konten, atau dapat ditemukan dengan pencarian teks Ctrl-F lama biasa.
smci
@smci Saya setuju apa yang Anda katakan tentang pengindeksan (ditambah fakta bahwa gambar tidak dapat diedit oleh orang lain) tetapi tidak terlihat sebagus dan membutuhkan pengguliran yang membuatnya sulit untuk diikuti.
cs95
bagaimanapun Anda perlu menulis ulang agar mudah digunakan bagi pengguna baru; bukannya hal-hal dimengerti seperti 'Hindari 'Unnamed: 0'' itu harus mengatakan sesuatu yang polos bahasa Inggris seperti ' index_col: panda kirim yang kolom (s) untuk digunakan sebagai indeks untuk dataframe Anda'
smci
@smci Sepertinya tabel ASCII tidak berfungsi baik dengan superskrip - ini mengacaukan pemformatan tabel.
cs95
cs95: Saya merekomendasikan Unicode, bukan ASCII. Unicode berfungsi dengan baik. Jadi hanya mengubah default di pull-down pada ozh.github.io/ascii-tables
smci
9

Berikut alternatif pustaka pandas menggunakan modul csv bawaan Python .

import csv
from pprint import pprint
with open('foo.csv', 'rb') as f:
    reader = csv.reader(f)
    headers = reader.next()
    column = {h:[] for h in headers}
    for row in reader:
        for h, v in zip(headers, row):
            column[h].append(v)
    pprint(column)    # Pretty printer

akan mencetak

{'Date': ['2012-06-11',
          '2012-06-12',
          '2012-06-13',
          '2012-06-14',
          '2012-06-15',
          '2012-06-16',
          '2012-06-17'],
 'factor_1': ['1.255', '1.258', '1.249', '1.253', '1.258', '1.263', '1.264'],
 'factor_2': ['1.548', '1.554', '1.552', '1.556', '1.552', '1.558', '1.572'],
 'price': ['1600.20',
           '1610.02',
           '1618.07',
           '1624.40',
           '1626.15',
           '1626.15',
           '1626.15']}
sidi
sumber
6
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

Ini akan mengimpor file .txt atau .csv Anda ke DataFrame.

Rishabh
sumber
1
%cd C:\Users\asus\Desktop\python
import pandas as pd
df = pd.read_csv('value.txt')
df.head()
    Date    price   factor_1    factor_2
0   2012-06-11  1600.20 1.255   1.548
1   2012-06-12  1610.02 1.258   1.554
2   2012-06-13  1618.07 1.249   1.552
3   2012-06-14  1624.40 1.253   1.556
4   2012-06-15  1626.15 1.258   1.552
chahat
sumber
0

Anda dapat menggunakan modul csv yang ada di pustaka standar python untuk memanipulasi file CSV.

contoh:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
KurzedMetal
sumber
-0. Berasal dari R, mazlor tidak akan mencari csvmodul karena levelnya terlalu rendah. pandasmemberikan tingkat abstraksi yang diminta.
Steven Rumbalski
... selain itu membaca data menjadi objek Python yang berguna seperti array numpy ...
Paul Hiemstra
0

import panda sebagai pd
dataset = pd.read_csv ('/ home / nspython / Downloads / movie_metadata1.csv')

ns_piumal
sumber
-1

Perhatikan cukup bersih, tetapi:

import csv

with open("value.txt", "r") as f:
    csv_reader = reader(f)
    num = '  '
    for row in csv_reader:
        print num, '\t'.join(row)
        if num == '  ':  
            num=0
        num=num+1

Tidak sekompak, tetapi berfungsi:

   Date price   factor_1    factor_2
1 2012-06-11    1600.20 1.255   1.548
2 2012-06-12    1610.02 1.258   1.554
3 2012-06-13    1618.07 1.249   1.552
4 2012-06-14    1624.40 1.253   1.556
5 2012-06-15    1626.15 1.258   1.552
6 2012-06-16    1626.15 1.263   1.558
7 2012-06-17    1626.15 1.264   1.572
Lee-Man
sumber
1
Ini tidak menjawab pertanyaan OP karena tidak membaca data csv menjadi objek Python.
Paul Hiemstra
mungkin mengganti num dengan enumerate di loop for?
LWZ
@PaulHiemstra, OP tidak menyebut "objek", tapi minta kemudahan. Namun, saya curiga pendekatan "panda" lebih cocok dengan apa yang diminta.
Lee-Man