【问题标题】:Pandas Series apply lambda: NoneType found, but there are only str and list in the seriesPandas 系列 apply lambda: NoneType found,但系列中只有 str 和 list
【发布时间】:2019-06-25 10:03:31
【问题描述】:

编辑: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

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

【问题讨论】:

    标签: python python-3.x pandas dataframe lambda


    【解决方案1】:

    比较列表并删除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
    

    【讨论】:

    • 对不起:那些都运行没有错误,但我想joinlist(非str)元素,notjoin@ 987654327@ 元素。
    【解决方案2】:

    事实证明,问题在于 DataFrame 中的列表本身包含 None 元素。为了解决这个问题,我没有在 apply 中使用 lambda 函数,而是编写了一个普通函数,它使用内置函数 filter 删除列表中的 Nones:

    def make_strings(thing):
        if isinstance(thing, list):
            return ' '.join(filter(None, thing))
        else:
            return str(thing)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-26
      • 2020-09-02
      • 2020-10-19
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      相关资源
      最近更新 更多