如何用Pandas高效处理列表型列,按字典映射值保留最高的至多2个元素
无逐行循环的Pandas高效实现
通过列表炸开、向量化映射、分组聚合的全向量化流程替代手动嵌套循环,核心计算全部由Pandas底层C实现完成,万级以上数据量下比逐行遍历的性能提升可达10~100倍。
完整可运行代码
import pandas as pd # 构造原始示例数据 df = pd.DataFrame({ "col1": ["A", "B", "C", "D"], "col2": [["x", "y"], ["z"], ["p", "q", "x", "y"], ["q", "z", "t"]] }) # 定义映射字典 d = {"x":3, "y":2, "z":5, "p":4, "q":7, "t":6} # 核心处理流程 # 1. 炸开col2的列表元素,保留原始行索引避免对齐错乱 exploded_df = df.explode("col2").reset_index(names="orig_row_idx") # 2. 向量化完成字典映射,无需逐元素写循环 exploded_df["map_value"] = exploded_df["col2"].map(d) # 3. 按原始行分组,按映射值降序排序后每组取最高的2个元素,再聚合回列表结构 df["col2"] = ( exploded_df .sort_values(["orig_row_idx", "map_value"], ascending=[True, False]) .groupby("orig_row_idx") .head(2) # 内置向量化取每组前2个元素,无Python层循环 .groupby("orig_row_idx")["col2"] .agg(list) # 内置聚合回列表结构,无Python层循环 .values )
输出验证
运行后得到的DataFrame完全匹配预期目标:
col1 col2 A [x,y] B [z] C [p,q] D [q,t]
补充说明
- 整个流程除字典映射外,全部使用Pandas内置向量化方法,彻底规避Python层逐行、逐元素的循环开销
- 若列表中存在字典外的元素,可在映射后补充
.fillna(0)设置默认映射值,避免空值导致排序异常
内容的提问来源于stack exchange,提问作者Kallol
相关产品推荐
相关产品推荐

