You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:30:51