Saya memiliki file csv yang tidak masuk dengan benar pandas.read_csv
ketika saya memfilter kolom dengan usecols
dan menggunakan beberapa indeks.
import pandas as pd
csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""
f = open('foo.csv', 'w')
f.write(csv)
f.close()
df1 = pd.read_csv('foo.csv',
header=0,
names=["dummy", "date", "loc", "x"],
index_col=["date", "loc"],
usecols=["dummy", "date", "loc", "x"],
parse_dates=["date"])
print df1
# Ignore the dummy columns
df2 = pd.read_csv('foo.csv',
index_col=["date", "loc"],
usecols=["date", "loc", "x"], # <----------- Changed
parse_dates=["date"],
header=0,
names=["dummy", "date", "loc", "x"])
print df2
Saya berharap bahwa df1 dan df2 harus sama kecuali untuk kolom dummy yang hilang, tetapi kolomnya salah label. Juga tanggal diurai sebagai tanggal.
In [118]: %run test.py
dummy x
date loc
2009-01-01 a bar 1
2009-01-02 a bar 3
2009-01-03 a bar 5
2009-01-01 b bar 1
2009-01-02 b bar 3
2009-01-03 b bar 5
date
date loc
a 1 20090101
3 20090102
5 20090103
b 1 20090101
3 20090102
5 20090103
Menggunakan nomor kolom daripada nama memberi saya masalah yang sama. Saya dapat mengatasi masalah ini dengan menghapus kolom boneka setelah langkah read_csv, tetapi saya mencoba memahami apa yang salah. Saya menggunakan panda 0.10.1.
edit: memperbaiki penggunaan header yang buruk.
python
pandas
csv
csv-import
chip
sumber
sumber
header
dan Andanames
tidak benar (itulah sebabnya baris pertama hilang dalam contoh Anda.header
Mengharapkan int (default 0) sebagai baris dengan tajuk. Karena Anda memberikan 'True' yang diartikan sebagai 1, baris kedua (baris data pertama) digunakan sebagai tajuk dan hilang. Namun nama kolom sudah benar karena Anda menimpanya dengannames
argumen. Namun Anda dapat membiarkannya dan baris pertama digunakan untuk nama kolom secara default. Namun, itu tidak menyelesaikan pertanyaan awal Anda.usecols
bug. Mungkin terkait dengan bug 2654 ?Jawaban:
Jawaban oleh @chip sama sekali tidak memahami maksud dari dua argumen kata kunci.
Solusi ini mengoreksi keanehan tersebut:
import pandas as pd from StringIO import StringIO csv = r"""dummy,date,loc,x bar,20090101,a,1 bar,20090102,a,3 bar,20090103,a,5 bar,20090101,b,1 bar,20090102,b,3 bar,20090103,b,5""" df = pd.read_csv(StringIO(csv), header=0, index_col=["date", "loc"], usecols=["date", "loc", "x"], parse_dates=["date"])
Yang memberi kita:
x date loc 2009-01-01 a 1 2009-01-02 a 3 2009-01-03 a 5 2009-01-01 b 1 2009-01-02 b 3 2009-01-03 b 5
sumber
header=0
. Anda ingin menggunakanheader=None
dan kemudian menggunakannames
sebagai tambahan.usecols
indeks integer untuk kolom yang ingin dipertahankan @Mack?Kode ini mencapai apa yang Anda inginkan --- juga aneh dan pasti buggy:
Saya mengamati bahwa itu berhasil ketika:
a) Anda menentukan
index_col
rel. ke jumlah kolom yang benar-benar Anda gunakan - jadi tiga kolomnya dalam contoh ini, bukan empat (Anda berhentidummy
dan mulai menghitung sejak saat itu)b) sama untuk
parse_dates
c) tidak demikian karena
usecols
;) untuk alasan yang jelasd) di sini saya menyesuaikan
names
untuk mencerminkan perilaku iniimport pandas as pd from StringIO import StringIO csv = """dummy,date,loc,x bar,20090101,a,1 bar,20090102,a,3 bar,20090103,a,5 bar,20090101,b,1 bar,20090102,b,3 bar,20090103,b,5 """ df = pd.read_csv(StringIO(csv), index_col=[0,1], usecols=[1,2,3], parse_dates=[0], header=0, names=["date", "loc", "", "x"]) print df
yang mencetak
x date loc 2009-01-01 a 1 2009-01-02 a 3 2009-01-03 a 5 2009-01-01 b 1 2009-01-02 b 3 2009-01-03 b 5
sumber
names
angka dan berdasarkanusecols
sehingga datanya menjadi benar.Jika file csv Anda berisi data tambahan, kolom dapat dihapus dari DataFrame setelah impor.
import pandas as pd from StringIO import StringIO csv = r"""dummy,date,loc,x bar,20090101,a,1 bar,20090102,a,3 bar,20090103,a,5 bar,20090101,b,1 bar,20090102,b,3 bar,20090103,b,5""" df = pd.read_csv(StringIO(csv), index_col=["date", "loc"], usecols=["dummy", "date", "loc", "x"], parse_dates=["date"], header=0, names=["dummy", "date", "loc", "x"]) del df['dummy']
Yang memberi kita:
x date loc 2009-01-01 a 1 2009-01-02 a 3 2009-01-03 a 5 2009-01-01 b 1 2009-01-02 b 3 2009-01-03 b 5
sumber
Anda hanya perlu menambahkan
index_col=False
parameterdf1 = pd.read_csv('foo.csv', header=0, index_col=False, names=["dummy", "date", "loc", "x"], index_col=["date", "loc"], usecols=["dummy", "date", "loc", "x"], parse_dates=["date"]) print df1
sumber
impor csv terlebih dahulu dan gunakan csv.DictReader mudah untuk diproses ...
sumber