Pandas实现含分类非数值值的类VLOOKUP功能优化咨询
优化方案
核心思路是用pd.melt()将表2的宽表结构转为长表,一次性完成ProductID的统一规整,无需手动拆分每一个Site列,扩展性和效率都更高。
完整优化代码
import pandas as pd # 读取数据,统一指定ProductID为字符串类型,避免数字/混合格式匹配问题 sales_df = pd.read_csv("table1.csv", dtype={"ProductID": str}) product_df = pd.read_csv("table2.csv", dtype=str) # 宽表转长表,一步完成所有Site列的合并,保留站点维度方便后续分析 product_long = product_df.melt( id_vars="Brand", # 自动识别所有站点列,新增站点无需修改代码 value_vars=[col for col in product_df.columns if col.startswith("Site")], var_name="Site", value_name="ProductID" ).query("ProductID != 'N/A'") # 直接过滤无匹配的N/A记录 # 关联销售额+按品牌汇总,直接得到目标结果 result = ( sales_df.merge(product_long, on="ProductID", how="inner") .groupby("Brand", as_index=False)["Sales"] .sum() )
扩展功能示例(站点透视分析)
因为转换过程保留了站点字段,后续需要做站点维度的分析无需重新处理数据,直接生成透视表即可:
# 按品牌+站点统计销售额的透视表 site_pivot = ( sales_df.merge(product_long, on="ProductID", how="inner") .pivot_table(index="Brand", columns="Site", values="Sales", aggfunc="sum", fill_value=0) )
优化点说明
- 解决格式匹配问题:读取数据时统一指定字符串类型,彻底避免纯数字、字母数字混合值的匹配异常,兼容所有ID格式。
- 扩展性极强:后续如果新增Site4/Site5等列无需修改逻辑,代码会自动识别所有以
Site开头的列处理。 - 保留全维度信息:转换后的长表保留了
Site字段,后续需要按站点、按品牌+站点做透视分析都可以直接实现,不会丢失维度信息。 - 代码行数减少60%以上,全程无冗余的拆分、重命名、拼接操作,计算效率更高,适合大数据量场景。
内容的提问来源于stack exchange,提问作者G H
相关产品推荐
相关产品推荐

