Ich möchte das dtype
s mehrerer Spalten festlegen pd.Dataframe
(Ich habe eine Datei, die ich manuell in eine Liste von Listen analysieren musste, da die Datei nicht zugänglich war pd.read_csv
).
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
Ich bekomme
ValueError: entry not a 2- or 3- tuple
Die einzige Möglichkeit, sie festzulegen, besteht darin, jede Spaltenvariable zu durchlaufen und mit neu zu formulieren astype
.
dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
columns=['x','y'])
for c in mydata.columns:
mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype #=> int64
Gibt es einen besseren Weg?
df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])
"funktioniert" ... aber: sAntworten:
Seit 0.17 müssen Sie die expliziten Konvertierungen verwenden:
(Wie unten erwähnt,
convert_objects
wurde in 0.17 keine "Magie" mehr verworfen.)Sie können diese auf jede Spalte anwenden, die Sie konvertieren möchten:
und bestätigen Sie, dass der dtype aktualisiert wurde.
ALTE / VERRINGERTE ANTWORT für Pandas 0.12 - 0.16: Sie können verwenden
convert_objects
, um bessere d-Typen abzuleiten:Magie! (Traurig zu sehen, dass es veraltet ist.)
quelle
type.convert
in R ein bisschen; nett, lässt aber in einigen Fällen explizite Angaben zu.convert_objects()
es veraltet ist ... Ich bin nicht sicher, was es ersetzt hat?Für diejenigen, die von Google (usw.) kommen, wie ich:
convert_objects
ist seit 0.17 veraltet - wenn Sie es verwenden, erhalten Sie eine Warnung wie diese:Sie sollten etwa Folgendes tun:
df =
df.astype(np.float)
df["A"] =
pd.to_numeric(df["A"])
quelle
pd.to_datetime, to_timedelta, to_numeric
dafür hineingeworfen haben, sollte dies die akzeptierte Antwort sein.Sie können die Typen explizit mit Pandas
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
festlegen und ein Wörterbuch mit den gewünschten dtypes übergebendtype
Hier ist ein Beispiel:
Jetzt können Sie sehen, dass es sich geändert hat
quelle
Eine andere Möglichkeit, die Spaltentypen festzulegen, besteht darin, zuerst ein Numpy-Datensatz-Array mit den gewünschten Typen zu erstellen, es auszufüllen und dann an einen DataFrame-Konstruktor zu übergeben.
quelle
vor einem ähnlichen Problem wie Sie. In meinem Fall habe ich Tausende von Dateien aus Cisco-Protokollen, die ich manuell analysieren muss.
Um mit Feldern und Typen flexibel zu sein, habe ich erfolgreich mit StringIO + read_cvs getestet, das tatsächlich ein Diktat für die dtype-Spezifikation akzeptiert.
Normalerweise bekomme ich jede der Dateien (5k-20k Zeilen) in einen Puffer und erstelle die dtype-Wörterbücher dynamisch.
Schließlich verkette ich diese Datenrahmen (mit kategorischen ... dank 0.19) zu einem großen Datenrahmen, den ich in hdf5 ablege.
Etwas in diese Richtung
Nicht sehr pythonisch ... aber macht den Job
Ich hoffe es hilft.
JC
quelle
Verwenden Sie besser typisierte np.arrays und übergeben Sie die Daten- und Spaltennamen als Wörterbuch.
quelle