长格式pandas DataFrame基于嵌套字典查找重映射值的更优实现方法
方案1:简洁实现(适合中小数据集)
通过展开嵌套映射字典为单层元组Key的形式,结合map方法实现,代码非常简洁易读:
import pandas as pd # 展开嵌套的映射字典为单层结构,key为(var, value)元组 single_map = {(var, val): label for var, inner_map in value_map.items() for val, label in inner_map.items()} # 生成labelled列,未匹配到的项用原value填充 df["labelled"] = df[["var", "value"]].apply(tuple, axis=1).map(single_map).fillna(df["value"])
方案2:高性能矢量化实现(适合大数据集)
通过左连接实现映射,避免apply逐行操作的性能损耗,处理百万行以上数据时效率更高:
import pandas as pd # 将映射字典转换为DataFrame用于关联 map_df = pd.DataFrame( [(var, val, label) for var, inner_map in value_map.items() for val, label in inner_map.items()], columns=["var", "value", "labelled"] ) # 左连接原表与映射表,未匹配到的项用原value填充 df = df.merge(map_df, on=["var", "value"], how="left") df["labelled"] = df["labelled"].fillna(df["value"])
两种实现的输出都和预期结果完全一致,均符合pandas的惯用语法,没有自定义循环逻辑,可读性和可维护性都更高。
内容的提问来源于stack exchange,提问作者baxx
相关产品推荐
相关产品推荐

