Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫系列应用lambda:NoneType,但该系列中只有str和list_Python_Python 3.x_Pandas_Dataframe_Lambda - Fatal编程技术网

Python 熊猫系列应用lambda:NoneType,但该系列中只有str和list

Python 熊猫系列应用lambda:NoneType,但该系列中只有str和list,python,python-3.x,pandas,dataframe,lambda,Python,Python 3.x,Pandas,Dataframe,Lambda,编辑:耶斯雷尔对我下面提出的问题有正确的答案。不幸的是,我问错了问题。事实证明,问题在于DataFrame列中的字符串列表包含None元素,这就是错误的来源。请查看我添加的用于修复此问题的代码的答案 第二次编辑:耶兹雷尔更新了他的答案,以一种与我相同的方式,但更简洁地用lambda表达 我有一个数据帧,我在其中选择一列,在该列上调用apply,我向其提供lambda表达式的参数,该表达式是if语句。我知道在这一点上,列被视为一个系列 该列由组合字符串和字符串列表组成,我希望通过连接它们的元素并

编辑:耶斯雷尔对我下面提出的问题有正确的答案。不幸的是,我问错了问题。事实证明,问题在于DataFrame列中的字符串列表包含
None
元素,这就是错误的来源。请查看我添加的用于修复此问题的代码的答案

第二次编辑:耶兹雷尔更新了他的答案,以一种与我相同的方式,但更简洁地用lambda表达


我有一个数据帧,我在其中选择一列,在该列上调用
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))

不工作

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

---------------------------------------------------------------------------
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
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
---->1原始数据.地址.应用(lambda x:x,如果类型(x)==str else“”。加入(x))
/应用中的Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/series.py(self、func、convert_dtype、args、**kwds)
3589其他:
3590值=self.astype(object.values)
->3591 mapped=lib.map\u推断(值,f,convert=convert\u数据类型)
3592
3593如果len(映射)和isinstance(映射[0],系列):
pandas/_libs/lib.pyx在pandas中。_libs.lib.map_infere()
in(x)
---->1原始数据.地址.应用(lambda x:x,如果类型(x)==str else“”。加入(x))
TypeError:序列项0:应为str实例,未找到非类型

我不明白为什么这样不行。我的理解是语法是正确的

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

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

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

抱歉:这些都没有错误,但我想
加入
列表
(非
str
)元素,而不是
加入
str
元素。
def make_strings(thing):
    if isinstance(thing, list):
        return ' '.join(filter(None, thing))
    else:
        return str(thing)