Frage Wandle ganze Pandas-Datenfelder mit NaN-Werten von String in Float um


Ich möchte alle Werte in einem Pandas-Datenrahmen von Strings in Floats konvertieren. Mein Datenrahmen enthält verschiedene NaN-Werte (z. B. NaN, NA, None). Beispielsweise,

import pandas as pd
import numpy as np

my_data = np.array([[0.5, 0.2, 0.1], ["NA", 0.45, 0.2], [0.9, 0.02, "N/A"]])
df = pd.DataFrame(my_data, dtype=str)

ich habe gefunden Hier und Hier (unter anderem) könnte convert_objects der richtige Weg sein. Ich bekomme jedoch eine Nachricht, dass es veraltet ist (ich verwende Pandas 0.17.1) und sollte stattdessen to_numeric verwenden.

df2 = df.convert_objects(convert_numeric=True)

Ausgabe:

FutureWarning: convert_objects is deprecated.  Use the data-type specific converters pd.to_datetime, pd.to_timedelta and pd.to_numeric.

Aber to_numeric scheint die Strings nicht wirklich zu konvertieren.

df3 = pd.to_numeric(df, errors='force')

Ausgabe:

df2:
     0     1    2
0  0.5  0.20  0.1
1  NaN  0.45  0.2
2  0.9  0.02  NaN

df2 dtypes:
0    float64
1    float64
2    float64
dtype: object

df3:
     0     1    2
0  0.5   0.2  0.1
1   NA  0.45  0.2
2  0.9  0.02  N/A

df3 dtypes:
0    object
1    object
2    object
dtype: object

Sollte ich convert_objects verwenden und mit der Warnmeldung umgehen, oder gibt es eine geeignete Möglichkeit, was ich mit to_numeric machen soll?


5
2018-03-11 20:34


Ursprung


Antworten:


Seltsamerweise funktioniert das:

In [11]:
df.apply(lambda x: pd.to_numeric(x, errors='force'))

Out[11]:
     0     1    2
0  0.5  0.20  0.1
1  NaN  0.45  0.2
2  0.9  0.02  NaN

Es scheint, dass es aus irgendeinem Grund nicht in der Lage ist, das gesamte df zu erzwingen, was ein wenig überraschend ist

Wenn Sie das Tippen (dank @Zero) hassen, dann können Sie einfach verwenden:

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

2
2018-03-11 20:44



Du kannst es versuchen replace und astype:

import pandas as pd
import numpy as np

my_data = np.array([[0.5, 0.2, 0.1], ["NA", 0.45, 0.2], [0.9, 0.02, "N/A"]])
df = pd.DataFrame(my_data, dtype=str)

print df.replace({r'N': np.nan}, regex=True).astype(float)
     0     1    2
0  0.5  0.20  0.1
1  NaN  0.45  0.2
2  0.9  0.02  NaN

1
2018-03-11 20:45