基于ID匹配用priceMapping填充data缺失Price值的Pandas技术问询
嗨,这事儿用Pandas分分钟搞定,我给你两种实用的方案,你可以根据自己的习惯选:
准备工作
首先确保你已经导入了Pandas库:
import pandas as pd
先把你的两个DataFrame定义出来(方便你直接复制测试):
# 构建data DataFrame data = pd.DataFrame({ "Global id": ["AR.1852218.1", "AR.1852223.1", "AR.1852251.1", "AR.1852254.1", "AR.1852257.1", "AR.1852386.1", "AR.1852549.1"], "Price": ["", "0,6", "0,56", "", "0,25", "0,33", ""] }) # 构建priceMapping DataFrame priceMapping = pd.DataFrame({ "G.ID": ["AR.1852218.1", "AR.1852254.1", "AR.1852549.1"], "Price": ["0,1", "0,25", "0,33"] })
方案一:用map()快速填充(推荐)
这种方法简洁高效,适合一对一匹配的场景:
# 把priceMapping转成字典,键是G.ID,值是对应的Price price_lookup = priceMapping.set_index("G.ID")["Price"].to_dict() # 先把data里的空字符串转成Pandas标准缺失值,再用字典映射填充 data["Price"] = data["Price"].replace("", pd.NA) data["Price"] = data["Price"].fillna(data["Global id"].map(price_lookup))
方案二:用merge()合并填充(更灵活)
如果之后需要扩展匹配规则(比如多字段匹配),用合并的方式更灵活:
# 左合并两个DataFrame,保留data的所有行,给映射表的Price加个后缀区分 merged_data = data.merge(priceMapping, left_on="Global id", right_on="G.ID", how="left", suffixes=("", "_from_map")) # 用映射表的Price填充原Price的缺失值 merged_data["Price"] = merged_data["Price"].replace("", pd.NA) merged_data["Price"] = merged_data["Price"].fillna(merged_data["Price_from_map"]) # 保留原data的列结构 data = merged_data[["Global id", "Price"]]
验证结果
执行完上面的代码后,打印data就能看到填充后的结果:
print(data)
输出如下:
Global id Price 0 AR.1852218.1 0,1 1 AR.1852223.1 0,6 2 AR.1852251.1 0,56 3 AR.1852254.1 0,25 4 AR.1852257.1 0,25 5 AR.1852386.1 0,33 6 AR.1852549.1 0,33
小提示
如果之后需要对Price做数值计算,记得把逗号分隔的格式转成点分隔的浮点型:
data["Price"] = data["Price"].str.replace(",", ".").astype(float)
内容的提问来源于stack exchange,提问作者swissmade
相关产品推荐
相关产品推荐

