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

时间:2013-08-25 22:04:51

标签: python pandas

假设我在数据框中有一个列,其中包含一些数字和一些非数字

>> 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: -

3 个答案:

答案 0 :(得分:54)

在pandas 0.17.0 convert_objects中发出警告:

  

FutureWarning:不推荐使用convert_objects。使用数据类型   特定转换器pd.to_datetime,pd.to_timedelta和pd.to_numeric。

您可以使用pd.to_numeric方法并将其应用于具有arg coerce的数据框。

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

或者更合适:

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

修改

以上方法仅适用于来自docs what's new in pandas 0.17.0的pandas版本> = 0.17.0

  

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

答案 1 :(得分:31)

使用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方法。

答案 2 :(得分:8)

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

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