Python DataFrame字符串分割报错:'list'对象无'str'属性
解决Pandas中提取字符串时的AttributeError问题
嘿,这个错误我太熟悉了!咱们先搞清楚问题出在哪:
你写的lambda x: x.split('_').str[1]里,x.split('_')会把单个字符串分割成Python原生列表(比如你的示例会变成['AAA', 'BBB', 'New Zeon', 'Dec 25 2017']),而.str属性是Pandas Series独有的方法,原生列表根本没有这个属性,所以就抛出了AttributeError: 'list' object has no attribute 'str'。
方法一:直接用列表索引(适合简单场景)
既然split返回的是列表,直接用索引取值就行。注意你要的是第二个下划线后的内容,对应列表的第3个元素(索引从0开始),所以代码改成这样:
df['Region'] = df.Campaign.apply(lambda x: x.split('_')[2])
如果担心有些Campaign字符串的下划线数量不足3个(会导致索引越界),可以加个判断兜底:
df['Region'] = df.Campaign.apply(lambda x: x.split('_')[2] if len(x.split('_')) >= 3 else '')
方法二:用Pandas矢量化操作(更高效)
其实不用apply也能搞定,Pandas的str.split本身就支持矢量化处理,速度比逐行apply快很多(尤其是数据量大的时候):
# expand=True会把分割后的结果展开成多列DataFrame,然后取第3列(索引2) df['Region'] = df['Campaign'].str.split('_', expand=True)[2]
同样,要处理下划线不足的情况,可以用fillna填充空值:
df['Region'] = df['Campaign'].str.split('_', expand=True)[2].fillna('')
这样就能顺利把Campaign里第二个下划线后的内容提取到Region列啦!
内容的提问来源于stack exchange,提问作者Naxe
相关产品推荐
相关产品推荐

