Dataframe中元素为字符串列表的列如何实现元素级转换?
解决DataFrame中列表列提取最后一段数字的问题
问题场景
假设我们有如下DataFrame,其中某列的每个元素都是包含0到n个字符串的列表:
import pandas as pd df = pd.DataFrame({'col_w_list':[['c/100/a/111','c/100/a/584','c/100/a/324'], ['c/100/a/327'], ['c/100/a/324','c/100/a/327'], ['c/100/a/111','c/100/a/584','c/100/a/999'], ['c/100/a/584','c/100/a/327','c/100/a/999'] ]})
需求
需要将该列转换为仅保留每个字符串的最后一组数字,最终结果如下:
| target_still_list | |
|---|---|
| 0 | ['111', '584', '324'] |
| 1 | ['327'] |
| 2 | ['324', '327'] |
| 3 | ['111', '584', '999'] |
| 4 | ['584', '327', '999'] |
错误原因分析
已知单个列表的处理方式:
from os import path ls = ['c/100/a/111','c/100/a/584','c/100/a/324'] new_ls = [path.split(x)[1] for x in ls] # 或者另一种写法 new_ls = [x.split('/')[3] for x in ls]
但直接执行df['col_w_list'].apply([lambda x: x.split('/')[3] for x in df['col_w_list']])会抛出AttributeError,原因是apply方法需要传入一个函数,而非列表推导式——你错误地把针对整个列的列表推导式传给了apply,但apply是对列中的每个元素(即每个子列表)单独处理,因此需要把处理单个列表的逻辑封装成函数传入。
正确解决方法
方法1:lambda函数结合列表推导式
直接在apply中编写lambda,对每个子列表执行列表推导:
# 用split('/')取最后一段(更通用,适配分段数变化的情况) df['target_still_list'] = df['col_w_list'].apply(lambda lst: [x.split('/')[-1] for x in lst]) # 或者用os.path.split的方式 from os import path df['target_still_list'] = df['col_w_list'].apply(lambda lst: [path.split(x)[1] for x in lst])
方法2:封装成独立函数
如果后续逻辑需要扩展,可以把处理单个列表的逻辑写成独立函数,再传给apply:
def extract_last_num(lst): return [x.split('/')[-1] for x in lst] df['target_still_list'] = df['col_w_list'].apply(extract_last_num)
运行上述任意一种方法,都能得到目标结果。
内容的提问来源于stack exchange,提问作者IgorM
相关产品推荐
相关产品推荐

