首页 > 解决方案 > AttributeError:'NoneType' 对象在基于空间分隔时没有属性'split'

问题描述

我正在尝试使用以下代码分隔下面的列,但出现以下错误:

AttributeError: 'NoneType' object has no attribute 'split'

代码:

df_no_dup["tag_count"] = df_no_dup["Tags"].apply(lambda text: len(text.split(' ')))

在此处输入图像描述

标签: pythonpandasdataframe

解决方案


这意味着您None"Tags"列中,因此您可以输入 if/elseapply来说明这一点:

df_no_dup["tag_count"] = df_no_dup["Tags"].apply(lambda text: len(text.split(" "))
                                                              if text is not None
                                                              else 0)

我们将 0 放在else子句中,因此Nones 将转换为 0 in tag_count

但更好的是,让我们使用str访问器方法str.splitstr.len它会为我们处理Nones:

df_no_dup["tag_count"] = df_no_dup["Tags"].str.split(" ").str.len()

首先拆分" "以给出每行的列表,然后我们得到每个列表的长度。但是请注意,这将NaN作为None原始系列中的条目的结果。这可能是你想要的;或者如果你想用 0 填充它们,你可以链接 a fillna

df_no_dup["tag_count"] = (df_no_dup["Tags"]
                              .str.split(" ")
                              .str.len()
                              .fillna(0, downcast="infer"))

我们用 0 填充它们,但也传递downcast,以便结果不是浮点数,而是整数,这对于计数列更有意义。(它在中间步骤中变为浮动的原因是因为NaN(s)。)


还有一种方法是使用str.countwith" "然后将结果加 1;我们计算空格的数量,然后再增加 1 个空格来计算字数:

df_no_dup["tag_count"] = df_no_dup["Tags"].str.count(" ").add(1)

同样,None条目将NaN在最后,因此您可以fillna如上所述进行链接。

最后要注意的是,这些都在考虑一个空格;但是如果你想分割多个空格,你可以不传递任何东西str.split,默认情况下它会这样做,str.split()对于str.count,你可以传递正则表达式r"\s+",即str.count(r"\s+")多个连续的空格。


推荐阅读