2016-04-18 18 views
4

Ich habe einen DataFrame, in dem eine Spalte drei Arten von Werten haben kann, Integer (12331), ganze Zahlen als Strings ('345') oder eine andere Zeichenfolge ('Text').Ignorieren nicht-numerischen String-Werte in Pandas Datenframe

Gibt es eine Möglichkeit, alle Zeilen mit der letzten Art von Zeichenfolge aus dem Datenframe zu löschen und die erste Art von Zeichenfolge in Ganzzahlen zu konvertieren? Oder zumindest eine Möglichkeit, die Zeilen, die Typfehler verursachen, zu ignorieren, wenn ich die Spalte summiere.

Dieser Datenrahmen stammt aus dem Lesen einer ziemlich großen CSV-Datei (25 GB), also hätte ich gerne eine Lösung, die beim Einlesen von Stücken funktioniert.

Antwort

6

Pandas verfügt über einige Tools zum Konvertieren dieser Arten von Spalten, die jedoch möglicherweise nicht genau Ihren Anforderungen entsprechen. pd.to_numeric konvertiert gemischte Spalten wie Ihre, konvertiert jedoch nicht numerische Zeichenfolgen in NaN. Das bedeutet, dass Sie Float-Spalten, nicht Integer, erhalten, da nur Float-Spalten NaN Werte haben können. Das ist normalerweise nicht so wichtig, aber es ist gut, sich dessen bewusst zu sein.

df = pd.DataFrame({'mixed_types': [12331, '345', 'text']}) 

pd.to_numeric(df['mixed_types'], errors='coerce') 
Out[7]: 
0 12331.0 
1  345.0 
2  NaN 
Name: mixed_types, dtype: float64 

Wenn Sie wollen, dann alle NaN Reihen fallen:

# Replace the column with the converted values 
df['mixed_types'] = pd.to_numeric(df['mixed_types'], errors='coerce') 

# Drop NA values, listing the converted columns explicitly 
# so NA values in other columns aren't dropped 
df.dropna(subset = ['mixed_types']) 
Out[11]: 
    mixed_types 
0  12331.0 
1  345.0 
+0

Da das NaN nach dem Lesen erstellt wird, würden diese Werte fallen, wenn ich na_values ​​= 'NaN' setze und drop_na ausführe? – devil0150

+0

@ devil0150 Yeah, '' dropna() 'zu tun, sobald du konvertiert hast, ist nicht zu schwierig, siehe meine Bearbeitung – Marius

+0

Arbeitet nicht für '$ 1,00' Währung. :( – xtian

1

Sie pd.to_numeric mit errors=coerce verwenden könnte Ihre nicht numerische Werte mit NaN und wenden sie die jede Spalte zu ersetzen. Dann können Sie dropna oder fillna verwenden, was auch immer Sie bevorzugen.

df = pd.read_csv('file.csv') 
df = df.apply(pd.to_numeric, errors='coerce') 
df = df.dropna() 
0

können Sie df._get_numeric_data() direkt verwenden.

Verwandte Themen