【发布时间】:2019-06-25 10:03:31
【问题描述】:
编辑:jezrael 对我在下面提出的问题有正确的答案。不幸的是,我问错了问题。事实证明,问题在于 DataFrame 列中的字符串列表包含 None 元素,这是错误的来源。请查看我为用于解决此问题的代码添加的答案。
第二次编辑:jezrael 已将他的答案更新为我所做的事情,但更简洁地使用 lambda 表达式。
我有一个 DataFrame,我在其中选择一列,在该列上调用 apply,我向其提供 lambda 表达式的参数,这是一个 if 语句。我知道此时该列被视为一个系列。
该列由字符串和字符串列表组成,我希望通过连接它们的元素并将该列表替换为结果字符串来将后者转换为纯字符串,以便 FataFrame 列只是字符串。
相关代码:
raw_data.address = raw_data.address.fillna('')
此时我已经遍历了整个地址列并将所有类型添加到一个集合中——该集合中唯一的元素是str 和list。
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
我不明白为什么这不起作用。我的理解是语法是正确的。
【问题讨论】:
标签: python python-3.x pandas dataframe lambda