为什么pandas.apply()在null元素上执行?

时间:2016-01-03 08:01:03

标签: python pandas

据说,pandas.apply()函数不适用于null元素。但是,在以下代码中不会出现这种情况。为什么会这样?

import pandas as pd
df = pd.Series([[1,2],[2,3,4,5],None])
df
0          [1, 2]
1    [2, 3, 4, 5]
2            None
dtype: object
df.apply(lambda x: len(x))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Alexander\Anaconda3\lib\site-packages\pandas\core\series.py", l
ine 2169, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas\src\inference.pyx", line 1059, in pandas.lib.map_infer (pandas\li
b.c:62578)
  File "<stdin>", line 1, in <lambda>
TypeError: object of type 'NoneType' has no len()

2 个答案:

答案 0 :(得分:2)

无和nan在语义上是等价的。用numpy.nan替换None是没有意义的。 apply仍然会将该函数应用于NaN元素。

df[2] = numpy.nan
df.apply(lambda x: print(x))

Output: [1, 2]
        [2, 3, 4, 5]
        nan

您必须检查要应用的函数中的缺失值,或使用pandas.dropna并将函数应用于结果:

df.dropna().apply(lambda x: print(x))

或者,使用返回一系列布尔值的pandas.notnull()

df[df.notnull()].apply(lambda x: print(x))

请同时阅读:http://pandas.pydata.org/pandas-docs/stable/missing_data.html

具体而言,这是:

  

警告:

     

必须要注意的是,在python(和numpy)中,nan不会   比较相等,但没有。请注意,Pandas / numpy使用了这个事实   np.nan!= np.nan,并且像np.nan一样对待None。

答案 1 :(得分:0)

作为kliron回答的后续措施,这一点更为重要。如果要将输出重新分配到新列,请务必注意索引将不再匹配。为此:

df.loc[df.notnull(), 'new_col'] = df[df.notnull()].apply(lambda x: print(x))