Pandas如何提取列表列指定前缀元素并转换字符串生成新列
解决方案
你已经完成了字符串列表转原生列表的步骤,后续只需要针对每行的列表做前缀匹配、字符串格式化即可,由于已知每行dr_md、dr_od前缀的元素各仅有一个,不需要额外处理多匹配、无匹配的复杂边界。
注意:执行转换前请确认列名拼写,原始数据列名为大写开头的
Listed_Items,不要误写为小写导致KeyError。
完整实现代码
import pandas as pd # 第一步:将字符串格式的列表转换为Python原生列表类型 df["Listed_Items"] = df["Listed_Items"].apply(eval) # 方法1:自定义通用处理函数,可读性更强 def parse_drink(item_list, prefix): for item in item_list: if item.startswith(prefix): # 移除前缀 → 下划线替换为空格 → 单词首字母大写 return item.removeprefix(prefix).replace("_", " ").title() return None # 生成两个新列 df["MD"] = df["Listed_Items"].apply(lambda x: parse_drink(x, "dr_md_")) df["OD"] = df["Listed_Items"].apply(lambda x: parse_drink(x, "dr_od_")) # 提取需要的列得到最终结果 final_df = df[["Name", "MD", "OD"]]
如果你偏好更简洁的写法,也可以不用单独定义函数,直接用生成器表达式取匹配项处理,效果完全一致:
# 方法2:简洁单行写法 df["MD"] = df["Listed_Items"].apply(lambda x: next(i.removeprefix("dr_md_").replace("_", " ").title() for i in x if i.startswith("dr_md_"))) df["OD"] = df["Listed_Items"].apply(lambda x: next(i.removeprefix("dr_od_").replace("_", " ").title() for i in x if i.startswith("dr_od_"))) final_df = df[["Name", "MD", "OD"]]
最终输出结果
处理后得到的final_df完全匹配预期格式:
| Name | MD | OD |
|---|---|---|
| Tom | Coca Cola | Water |
| Steve | Pepsi | Orange Juice |
| Phil | Dr Pepper | Coffee |
逻辑说明
- 前缀匹配时补全末尾下划线,即匹配
dr_md_而非dr_md,避免误匹配其他同开头的非目标元素 - 用
removeprefix()方法移除前缀比固定长度切片更稳妥,不会因为前缀长度计算错误导致字符串截断异常 - Python原生的
title()方法会自动将空格分隔的每个单词首字母转为大写,其余字母转小写,刚好符合格式化要求
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

