从ActiveState(Python 2.7.2)和Pandas v0.14从Anaconda(Python 2.7.8)尝试Pandas v0.12。
当DataFrame的列中包含无法转换为数值的值时,没有任何列值会转换为NAN。当一个或多个值可以转换为数值时,所有非数字值都会正确转换为NAN。
import pandas as pd
pd.DataFrame({"c1":["1","2","3"], "c2":["a","b","c"]}).convert_objects(convert_numeric=True)
c1 c2
0 1 a
1 2 b
2 3 c
pd.DataFrame({"c1":["1","2","3"], "c2":["a","b","4"]}).convert_objects(convert_numeric=True)
c1 c2
0 1 NaN
1 2 NaN
2 3 4
我正在阅读用户提供的数据,因此我正在转换为数字,然后正确处理NAN值。
我可以阻止这种情况的唯一方法是添加一个充满浮点数(0.0)的虚拟行,执行转换然后删除该行。
我不能使用“.astype(float)”,因为它会引发异常。
如何确保所有非数字值都转换为NAN?
是否有人知道该行为是否也在Pandas v0.15或Python 3 +中?
答案 0 :(得分:1)
我认为没有一种巧妙的方法可以做到这一点(也许应该对astype有一个强制论证?)。
在similar vein to another question中,您可以使用applymap
:
def to_float_or_nan(x):
try:
return float(x)
except ValueError:
return float('nan')
df.applymap(to_float_or_nan)
您输入的结果是:
In [11]: pd.DataFrame({"c1":["1","2","3"], "c2":["a","b","4"]}).applymap(to_float_or_nan)
Out[11]:
c1 c2
0 1 NaN
1 2 NaN
2 3 4
In [12]: pd.DataFrame({"c1":["1","2","3"], "c2":["a","b","c"]}).applymap(to_float_or_nan)
Out[12]:
c1 c2
0 1 NaN
1 2 NaN
2 3 NaN
答案 1 :(得分:1)
设置'nan',其中value不是数字
>>> import pandas as pd
>>> df1 = pd.DataFrame({"c1":["1","2","3"], "c2":["a","b","c"]})
>>> df2 = pd.DataFrame({"c1":["1","2","3"], "c2":["a","b","4"]})
>>> M = lambda x: x.isdigit()==True
>>> df1[~df1.applymap(M)]='nan'
>>> df2[~df2.applymap(M)]='nan'
>>> df1
c1 c2
0 1 nan
1 2 nan
2 3 nan
>>> df2
c1 c2
0 1 nan
1 2 nan
2 3 4
希望,这会有所帮助