2017-08-23 3 views
3

Ich habe eine .csv-Datei, die eine exportierte Ausgabe von einer Software ist. Diese CSV-Datei enthält viele NaNs. Ich muss die Daten analysieren, indem ich es in einen Datenrahmen lese, und dataframe.fillna(0) verwenden, um alle NaNs durch 0 zu ersetzen. Wenn ich jedoch pandas.read_csv() verwende, um diese CSV-Datei zu importieren, ist der Typ des Elements im Datenrahmen 'str' dataframe.fillna(0) kann nicht verwendet werden. Meine Frage ist also: Wie konvertiert man das Element als np.float beim Lesen der .csv-Datei?Wie konvertiert man das Element in einem pandas.dataframe in np.float, während man pandas.read_csv benutzt, um die csv-Datei zu lesen?

Es ist ein Argument dtype für pandas.read_csv, hier ist die explantion:

dtype : Type name or dict of column -> type, default None 
Data type for data or columns. E.g. {‘a’: np.float64, ‘b’: np.int32} Use str 
or object to preserve and not interpret dtype. If converters are specified, 
they will be applied INSTEAD of dtype conversion. 

Alle Beispiele, wie es zu benutzen?

Vielen Dank!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

UPDATE:

Hier sind mehrere Lösungen von den Beantworter vorgeschlagen :

(1) von @Jakub. Wenn Sie na_values=NaN in pandas.read_csv() festlegen, können alle Elemente in der CSV-Datei in np.float konvertiert werden, da sie in den Dataframe eingelesen werden.

(2) von @ André Christoffer Andersen. Nach dem Lesen der .csv-Datei als Datenframe. Verwenden Sie pandas.to_numeric, um eine Spalte des Datenrahmens in np.float zu konvertieren. Verwenden Sie eine for-Schleife, um alle Spalten in numerische umzuwandeln.

(3) von @ThisGuyCantEven. Verwenden Sie numpy.loadtxt, um .csv-Datei in eine numpy.ndarray zu lesen. Verwenden Sie das Argument skiprows, um die Zeilen mit ungleichen Elementen zu überspringen. Verwenden Sie dann numpy.nan_to_num(), um nan in Nullen umzuwandeln.

Hoffentlich wird es folgenden Lesern helfen!

+3

Sie können read_csv sagen, was die NaN-Werte mit dem Parameter 'na_values' sind. Das sollte diese Werte in np.nan umwandeln, die Sie dann wie gewohnt ersetzen können. – Jakub

+0

Vielen Dank, @Jakub! Es wirkt wie ein Zauber! – Jundong

Antwort

2

Wenn Sie eine neue genug Pandas Version haben Sie auch pd.to_numeric(...) dafür verwenden können:

df['mycol'] = pd.to_numeric(df['mycol'], errors='coerce') 

Und hier ist ein Trick, den ganzen Datenrahmen zu konvertieren:

for col in df.columns: 
    df[col] = pd.to_numeric(df[col], errors='coerce') 
+0

Vielen Dank! Es funktioniert gut für ein Serienobjekt oder eine einzelne Datenrahmenspalte. Irgendeine Funktion, um den ganzen Datenrahmen zu konvertieren? – Jundong

+1

@Jundong Sicher. Siehe meine Bearbeitung. Einfach über die Spalten schleifen. –

1

Warum nicht einfach verwenden numpy.loadtxt? Wenn Sie Pandas verwenden möchten, weil Sie z. B. gemischte Daten haben und eine numerische Spalte als numpy Array verwenden möchten, können Sie immer df['column'].as_matrix() verwenden, oder Sie können den gesamten Datenrahmen konvertieren, wenn Sie möchten.

+0

Vielen Dank! Ich habe 'numpy.loadtxt' vergessen. Ich habe es gerade ausprobiert und erkannt, dass 'numpy.loadtxt' erfordert, dass jede Zeile die gleiche Anzahl an Elementen haben muss. Für mein .CSV-Datei, gibt es zuerst mehrere Zeilen, die übersprungen werden müssen, was auch durch das Argument 'skiprows' erfolgen kann. Für die 'nan' kann sie durch 'numpy.nan_to_num' in 0 umgewandelt werden. Dies könnte eine alternative Methode sein. – Jundong

+0

Sie können auch Spalten mit dem Argument 'usecols' überspringen. Wenn Sie jedoch bestimmte von einem Array angegebene Spalten überspringen möchten, müssen Sie dieses Array möglicherweise verwenden, um die Werte in einem anderen Array mit allen Spaltenindizes zu maskieren. – ThisGuyCantEven

Verwandte Themen