如何基于复杂规则对Python Pandas DataFrame做数据路由与扩展?
实现Pandas DataFrame的路由映射逻辑(默认规则+值覆盖)
核心逻辑梳理
- 待处理DataFrame中
From/To列有值时,直接通过From_Names/To_Names映射表获取对应名称,覆盖默认规则 - 当
From/To列为空时,使用默认路由规则填充对应的编码,再关联映射表获取名称
示例数据定义
先模拟符合场景的测试数据(可根据实际结构调整):
import pandas as pd # 默认路由规则表:按Category匹配默认From/To编码 default_routes = pd.DataFrame({ "Category": ["A", "B", "C"], "Default_From": ["F01", "F02", "F03"], "Default_To": ["T01", "T02", "T03"] }) # From编码-名称映射表 from_names = pd.DataFrame({ "From": ["F01", "F02", "F04", "F05"], "From_Name": ["总部", "分部1", "临时点1", "临时点2"] }) # To编码-名称映射表 to_names = pd.DataFrame({ "To": ["T01", "T02", "T04", "T05"], "To_Name": ["仓库1", "仓库2", "临时仓1", "临时仓2"] }) # 待处理原始数据 raw_data = pd.DataFrame({ "Category": ["A", "B", "C", "A", "B"], "From": [None, "F04", None, "F05", None], "To": ["T04", None, None, None, "T05"] })
实现代码
步骤1:填充默认路由编码
先关联默认规则表,用默认值填补空的From/To字段:
# 关联默认路由规则 raw_data_with_default = raw_data.merge(default_routes, on="Category", how="left") # 仅为空的From/To填充默认值 raw_data_with_default["From"] = raw_data_with_default["From"].fillna(raw_data_with_default["Default_From"]) raw_data_with_default["To"] = raw_data_with_default["To"].fillna(raw_data_with_default["Default_To"])
步骤2:关联名称映射表
通过左连接获取对应的From_Name和To_Name:
# 关联From名称 result = raw_data_with_default.merge(from_names, on="From", how="left") # 关联To名称 result = result.merge(to_names, on="To", how="left")
步骤3:整理输出结果
保留需要的字段,若存在无映射的编码,可将名称字段填充为原编码:
# 选择目标列 final_result = result[["Category", "From", "To", "From_Name", "To_Name"]] # 可选:将无映射的名称字段替换为原编码 final_result["From_Name"] = final_result["From_Name"].fillna(final_result["From"]) final_result["To_Name"] = final_result["To_Name"].fillna(final_result["To"]) print(final_result)
运行结果
Category From To From_Name To_Name 0 A F01 T04 总部 临时仓1 1 B F04 T02 临时点1 仓库2 2 C F03 T03 F03 T03 3 A F05 T01 临时点2 仓库1 4 B F02 T05 分部1 临时仓2
内容的提问来源于stack exchange,提问作者user1574881
相关产品推荐
相关产品推荐

