Ich habe eine CSV-Datei, die nicht richtig eingeht, pandas.read_csv
wenn ich die Spalten mit usecols
filtere und mehrere Indizes verwende.
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
Ich gehe davon aus, dass df1 und df2 bis auf die fehlende Dummy-Spalte identisch sein sollten, aber die Spalten sind falsch beschriftet. Auch das Datum wird als Datum analysiert.
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
Die Verwendung von Spaltennummern anstelle von Namen gibt mir das gleiche Problem. Ich kann das Problem umgehen, indem ich die Dummy-Spalte nach dem Schritt read_csv lösche, aber ich versuche zu verstehen, was falsch läuft. Ich benutze Pandas 0.10.1.
Bearbeiten: Fehlerhafte Header-Verwendung behoben.
python
pandas
csv
csv-import
Chip
quelle
quelle
header
undnames
nicht korrekt (aus diesem Grund fehlt in Ihrem Beispiel die erste Zeile.header
Erwartet ein int (Standard 0) als Zeile mit der Kopfzeile. Da Sie 'True' angeben, das als 1 interpretiert wird, Die zweite Zeile (erste Datenzeile) wird als Kopfzeile verwendet und fehlt. Die Spaltennamen sind jedoch korrekt, da Sie sie mit demnames
Argument überschreiben . Sie können sie jedoch beide belassen und die erste Zeile wird standardmäßig für die Spaltennamen verwendet. Es löst jedoch nicht Ihre anfängliche Frage.usecols
Fehler. Möglicherweise im Zusammenhang mit Fehler 2654 ?Antworten:
Die Antwort von @chip verfehlt den Punkt zweier Schlüsselwortargumente vollständig.
Diese Lösung korrigiert diese Kuriositäten:
Was uns gibt:
quelle
header=0
. Sie möchten verwendenheader=None
und dannnames
zusätzlich verwenden.usecols
mit ganzzahligen Indizes für die Spalten verwenden, die man @Mack behalten möchte?Dieser Code erreicht, was Sie wollen - auch sein seltsamer und sicherlich fehlerhafter:
Ich habe festgestellt, dass es funktioniert, wenn:
a) Sie geben die
index_col
rel. auf die Anzahl der Spalten, die Sie wirklich verwenden - also die drei Spalten in diesem Beispiel, nicht vier (Sie löschendummy
und beginnen von da an zu zählen)b) Gleiches für
parse_dates
c) nicht so für
usecols
;) aus offensichtlichen Gründend) hier habe ich das angepasst,
names
um dieses Verhalten widerzuspiegelnwelche druckt
quelle
names
und Zahlen basierend darauf gefunden,usecols
damit die Daten korrekt eingehen.Wenn Ihre CSV-Datei zusätzliche Daten enthält, können Spalten nach dem Import aus dem DataFrame gelöscht werden .
Was uns gibt:
quelle
Sie müssen nur den
index_col=False
Parameter hinzufügenquelle
Importieren Sie zuerst CSV und verwenden Sie CSV.DictReader. Es ist einfach zu verarbeiten ...
quelle