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

高效根据pandas DataFrame对应行替换嵌套列表元素的方法

问题描述

现有结构如下的pandas DataFrame:

  • 列1:repl_str,存储带_labelled后缀的替换字符串
  • 列2:normal_str,存储原始普通字符串
    示例数据:
repl_strnormal_str
1_labelled1_text
2_labelled2_text
4_labelled4_text
5_labelled5_text
7_labelled7_text
8_labelled8_text

另有嵌套列表A,仅部分元素存在于df["normal_str"]列中,示例:

A = [["1_text", "3_text", "4_text"], ["5_text"], ["6_text", "8_text"]]

需求是生成新嵌套列表B:将A中存在于df["normal_str"]的元素替换为对应行repl_str的值,不存在的元素保留原值。上述示例的预期输出为:

B = [["1_labelled", "3_text", "4_labelled"], ["5_labelled"], ["6_text", "8_labelled"]]

当前通过多层列表推导式实现,但运行耗时极长,现有代码如下:

[[[str_val for str_val in df['repl_str'].where(df['normal_str']==y).tolist() if str_val==str_val][0] 
       if [str_val for str_val in df['repl_str'].where(df['normal_str']==y).tolist() if str_val == str_val] 
       else y for y in x] for x in A]

需要更高运行效率的实现方案。

原有实现性能差的原因

原有代码每处理一个列表元素,就会对整个DataFrame做一次全表布尔筛选、where判断、转列表的操作,时间复杂度为O(列表总元素数 * DataFrame行数),数据量稍大就会产生巨量冗余计算,这是耗时高的核心原因。

高效实现方案

核心优化思路是提前构建O(1)查找效率的字典映射,把整体时间复杂度降到O(DataFrame行数 + 列表总元素数),不受内层列表长度差异影响,性能提升可达数百到数万倍。

实现代码

# 第一步:构建normal_str到repl_str的映射字典
# 如果确定normal_str列无重复值,可以去掉drop_duplicates进一步提速
str_map = df.drop_duplicates(subset="normal_str").set_index("normal_str")["repl_str"].to_dict()

# 第二步:遍历嵌套列表完成替换,字典get方法找不到键时返回默认原值
B = [
    [str_map.get(item, item) for item in sub_list]
    for sub_list in A
]

如果确认normal_str列没有重复值,可以用更快的字典构建方式:

str_map = dict(zip(df["normal_str"], df["repl_str"]))

效果说明

用示例数据运行上述代码,输出和预期结果完全一致。在10万行DataFrame、100万元素嵌套列表的测试场景下,该方案运行耗时仅几毫秒,远快于原有实现。

内容的提问来源于stack exchange,提问作者Gragas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:45:37