Pandas:转换为数字,必要时创建NaN



假设数据帧中有一列包含一些数字和一些非数字

>> df['foo']
0       0.0
1     103.8
2     751.1
3       0.0
4       0.0
5         -
6         -
7       0.0
8         -
9       0.0
Name: foo, Length: 9, dtype: object

如何将此列转换为np.float,并让其他所有非浮动列将其转换为NaN

当我尝试时:

>> df['foo'].astype(np.float)

>> df['foo'].apply(np.float)

我得到ValueError: could not convert string to float: -

在熊猫中0.17.0 convert_objects发出警告:

未来警告:convert_objects已弃用。使用数据类型特定转换器pd.to_datetime、pd.to_timedelta和pd.to_numeric.

您可以使用pd.to_numeric方法,并将其应用于参数为coerce的数据帧。

df1 = df.apply(pd.to_numeric, args=('coerce',))

或者更恰当地说:

df1 = df.apply(pd.to_numeric, errors='coerce')

编辑

以上方法仅适用于pandas版本>=0.17.0,来自文档pandas 0.17.0:中的新增内容

pd.to_numeric是一个将字符串强制为数字的新函数(可能带有强制)(GH11133)

使用convert_objects系列方法(和convert_numeric):

In [11]: s
Out[11]: 
0    103.8
1    751.1
2      0.0
3      0.0
4        -
5        -
6      0.0
7        -
8      0.0
dtype: object
In [12]: s.convert_objects(convert_numeric=True)
Out[12]: 
0    103.8
1    751.1
2      0.0
3      0.0
4      NaN
5      NaN
6      0.0
7      NaN
8      0.0
dtype: float64

注意:这也可用作DataFrame方法

您可以简单地使用pd.to_numeric并将错误设置为coerce,而不使用apply

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

首先用None替换所有字符串值,将其标记为缺失值,然后将其转换为浮点值。

df['foo'][df['foo'] == '-'] = None
df['foo'] = df['foo'].astype(float)

最新更新