假设数据帧中有一列包含一些数字和一些非数字
>> 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)