2016-09-30 17 views
2

Bei dem Versuch, diese Frage Get List of Unique String per Column zu beantworten, stießen wir auf ein anderes Problem von meinem Dataset. Wenn ich diese CSV-Datei in den Datenframe importiere, ist jede Spalte OBJECT-Typ, wir müssen die Spalten, die nur Zahlen sind, in reelle (Zahl) dtype und diejenigen, die keine Zahl sind, in String dtype konvertieren.Konvertieren Sie eine Objekt dtype Spalte zu Nummer Dtype in einer Datafrane Pandas

Gibt es einen Weg, dies zu erreichen?

Download the data sample from here

Ich habe folgende Code versucht, aus dem Artikel folgende Pandas: change data type of columns aber hat nicht funktioniert.

df = pd.DataFrame(a, columns=['col1','col2','col3']) 

Wie immer vielen Dank für Ihre Hilfe

+0

Automatische Konvertierung aller Spalten geschieht Art in der Regel zu widersprechen, wenn Kommas sind oder andere nicht numerische Zeichen in den ansonsten numerischen Spalten. Sie könnten versuchen, etwas wie 'df.replace (", "," ", regex = True) .astype (np.int64)' zum Entfernen der Zeichen und Konvertieren von Daten in einen numerischen Typ –

Antwort

1

Option 1
Verwendung pd.to_numeric in einem apply

df.apply(pd.to_numeric, errors='ignore') 

Option 2
pd.to_numeric verwenden auf df.values.ravel

cvrtd = pd.to_numeric(df.values.ravel(), errors='coerce').reshape(-1, len(df.columns)) 
pd.DataFrame(np.where(np.isnan(cvrtd), df.values, cvrtd), df.index, df.columns) 

Hinweis
Diese sind nicht genau das gleiche. Für einige Spalten, die gemischte Werte enthalten, wird Option 2 konvertiert, während Option 2 alles in dieser Spalte ein Objekt zurücklässt. Ein Blick auf Ihre Datei würde ich wählen Option 1.


Zeit

df = pd.read_csv('HistorianDataSample/HistorianDataSample.csv', skiprows=[1, 2]) 

enter image description here

+0

pd.to_numeric ist bereits vektorisiert - Sie muss selten angewendet werden – Jeff

+0

@Jeff Wie bearbeite ich 'pd.numeric' auf einen ganzen Datenrahmen? Das versuche ich hier zu tun. Außerdem könnte ich 'df' zuerst gestapelt haben, aber jede Spalte kann unterschiedlich sein. Der 'errors = 'ignore'-Befehl stoppt die Konvertierung, wenn ein Element in der gestapelten Serie nicht konvertiert wird. Wenn ich 'errors = 'coerce' verwende, wird es' nan' irgendwelche Werte, nicht numerisch. Ich kann nur daran denken, 'apply' zu verwenden, um jede Spalte separat zu bearbeiten. Es wird immer noch für jede Spalte vektorisiert. – piRSquared

+0

verwenden .Ravel() und verformen – Jeff

Verwandte Themen