在我的应用程序中,我收到一个pandas DataFrame(例如block),其中有一个名为的列est。此列可以包含字符串或浮点数的混合。我需要将列中的所有值都转换为浮点数,并且将列类型设置为float64。我使用以下代码执行此操作:
block[est].convert_objects(convert_numeric=True)
block[est].astype('float')
Run Code Online (Sandbox Code Playgroud)
这适用于大多数情况。但是,在一种情况下,est包含所有空字符串。在这种情况下,第一个语句将正确执行,但列中的空字符串仍为空字符串。然后,第二条语句导致错误:ValueError: could not convert string to float:。
如何修改代码以处理包含所有空字符串的列?
编辑:我知道我可以做block[est].replace("", np.NaN),但是我想知道是否有某种方法可以做到公正,convert_objects或者astype我错过了。
说明:出于项目特定的原因,我需要使用pandas 0.16.2。
这是与一些演示失败的示例数据的交互:
>>> block = pd.DataFrame({"eps":["", ""]})
>>> block = block.convert_objects(convert_numeric=True)
>>> block["eps"]
0
1
Name: eps, dtype: object
>>> block["eps"].astype('float')
...
ValueError: could not convert string to float:
Run Code Online (Sandbox Code Playgroud)
使用以下命令更容易做到:
pandas.to_numeric
http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.to_numeric.html
import pandas as pd
df = pd.DataFrame({'eps': ['1', 1.6, '1.6', 'a', '', 'a1']})
df['eps'] = pd.to_numeric(df['eps'], errors='coerce')
Run Code Online (Sandbox Code Playgroud)
'强制'会将任何值错误转换为 NaN
df['eps'].astype('float')
0 1.0
1 1.6
2 1.6
3 NaN
4 NaN
5 NaN
Name: eps, dtype: float64
Run Code Online (Sandbox Code Playgroud)
然后,您可以应用其他功能而不会出错:
df['eps'].round()
0 1.0
1 2.0
2 2.0
3 NaN
4 NaN
5 NaN
Name: eps, dtype: float64
Run Code Online (Sandbox Code Playgroud)
def convert_float(val):
try:
return float(val)
except ValueError:
return np.nan
df = pd.DataFrame({'eps': ['1', 1.6, '1.6', 'a', '', 'a1']})
>>> df.eps.apply(lambda x: convert_float(x))
0 1.0
1 1.6
2 1.6
3 NaN
4 NaN
5 NaN
Name: eps, dtype: float64
Run Code Online (Sandbox Code Playgroud)