python - Pandas系列应用lambda : NoneType found,,但系列中只有str和list

标签 python python-3.x pandas dataframe lambda

编辑:jezrael 对于我在下面提出的问题有正确的答案。对我来说不幸的是,我问错了问题。事实证明,问题在于 DataFrame 列中的字符串列表包含 None 元素,这就是错误的来源。请参阅我为我用来解决此问题的代码添加的答案。

第二次编辑:jezrael 已将他的答案更新为一种执行我所做操作的方法,但在 lambda 表达式中更简洁。

<小时/>

我有一个 DataFrame,我在其中选择一列,在该列上调用 apply,我向该列提供 lambda 表达式的参数,该参数是 if陈述。据我所知,此时该专栏被视为一个系列。

该列由字符串和字符串列表组成,我希望通过连接它们的元素并将该列表替换为结果字符串来将后者转换为纯字符串,以便 FataFrame 列只是字符串。

相关代码:

raw_data.address = raw_data.address.fillna('')

此时,我已循环遍历整个地址列,并将所有类型添加到一个集合中 - 该集合中唯一的元素是 strlist

raw_data.address.apply(lambda x: x if type(x) == str else ' '.join(x))

raw_data.address.apply(lambda x: x if isinstance(x, str) else ' '.join(x))

不工作。

这是两种情况下的错误消息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-32-5e2dce775d20> in <module>
----> 1 raw_data.address.apply(lambda x: x if type(x) == str else ' '.join(x))

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   3589             else:
   3590                 values = self.astype(object).values
-> 3591                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3592 
   3593         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-32-5e2dce775d20> in <lambda>(x)
----> 1 raw_data.address.apply(lambda x: x if type(x) == str else ' '.join(x))

TypeError: sequence item 0: expected str instance, NoneType found

我不明白为什么这不起作用。我的理解是语法是正确的。

最佳答案

比较列表并删除 None 值:

raw_data = pd.DataFrame({'address':[['a', 'b', None], 'c']})
print (raw_data)
        address
0  [a, b, None]
1             c

raw_data.address = (raw_data.address
                            .apply(lambda x: ' '.join(filter(None, x)) 
                                             if isinstance(x, list)
                                             else x))
print (raw_data)
  address
0     a b
1       c

关于python - Pandas系列应用lambda : NoneType found,,但系列中只有str和list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56751503/

相关文章:

python - 如何让 Python 将数组插入到 *.c 文件中?

python - 在 for 循环迭代期间对不同键的值执行算术/比较

re.finditer 的 Python 3 类型提示

python-3.x - 是否可以通过编程方式使用 pip 安装 python 库?

python - 在 pandas 中为 Stackoverflow/SO 问题重新生成数据框的代码

python - PANDAS 棘手的分组方法是在单个列的列表中使用多个组

python - 混合 matplotlib 变换

python - 如何从目录中找到与输入图像相似的图像?

python - 使用 pygerrit 从 gerrit url 获取机器人评论失败

python - 如何使用 pandas 根据用户输入另一列来输出特定列?