Pandas convert_object(convert_numeric = True)不会为完整系列的非数字值生成np.nan

时间:2014-12-20 01:26:22

标签: python pandas

从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 +中?

2 个答案:

答案 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

希望,这会有所帮助