pandas merge 合并表格检查清单
pandas merge 合并表格检查清单
做数据分析时,经常需要把两张表合在一起。比如一张订单表里只有商品编号,另一张商品表里有商品名称和分类。这个时候就会用到 pandas.merge。
merge 本身不难,真正容易出错的是合并前后的检查。如果键字段有重复、类型不一致,或者合并方式选错,结果可能会多出很多行,也可能悄悄丢掉数据。
这篇记录一份我常用的检查清单。
1、准备两张示例表
import pandas as pd
orders = pd.DataFrame({ "order_id": [1001, 1002, 1003, 1004], "product_id": ["P01", "P02", "P02", "P04"], "count": [2, 1, 3, 1],})
products = pd.DataFrame({ "product_id": ["P01", "P02", "P03"], "name": ["键盘", "鼠标", "显示器"], "category": ["外设", "外设", "屏幕"],})这里订单表中有一个 P04,商品表里没有对应记录。这个缺口正好可以用来观察不同合并方式的结果。
2、先检查键字段类型
合并前先看两边的字段类型:
print(orders.dtypes)print(products.dtypes)如果一边是数字,一边是字符串,即使看起来内容一样,也可能合不上。比如 1001 和 "1001" 是不同类型。
可以统一转成字符串:
orders["product_id"] = orders["product_id"].astype(str)products["product_id"] = products["product_id"].astype(str)这一步尤其适合编号、学号、手机号这类字段,因为它们本质上不是用来计算的数字。
3、检查右表键是否重复
如果商品表里 product_id 重复,合并后订单行数可能会被放大。可以这样检查:
dup = products[products["product_id"].duplicated(keep=False)]print(dup)如果输出不为空,就要先确认重复是否合理。
有些重复代表数据错误,需要去重:
products = products.drop_duplicates(subset=["product_id"])但有些重复代表一对多关系,比如一个用户有多条标签记录,这时不能盲目去重,而要先明确分析目标。
4、选择合并方式
最常见的是左连接,也就是保留订单表的所有行:
merged = orders.merge(products, on="product_id", how="left")print(merged)如果商品表缺少 P04,合并结果里对应的 name 和 category 会是空值。这样比较适合“以订单为主”的分析。
如果只想保留两边都能匹配上的记录,可以使用内连接:
matched = orders.merge(products, on="product_id", how="inner")内连接会丢掉没有匹配上的订单,所以使用前要确认这是不是你想要的结果。
5、合并后检查行数和缺失值
合并完成后,不要马上进入统计步骤,先检查行数:
print("orders:", len(orders))print("merged:", len(merged))如果是左连接,并且右表键没有重复,合并前后行数应该一致。
再检查没有匹配上的记录:
missing = merged[merged["name"].isna()]print(missing)这些记录通常需要单独处理。可能是商品表漏了,也可能是订单表里的编号写错了。
6、用 indicator 查看来源
调试合并问题时,可以加上 indicator=True:
check = orders.merge( products, on="product_id", how="outer", indicator=True,)
print(check["_merge"].value_counts())_merge 会告诉我们每一行来自左表、右表,还是两边都匹配上了。这个方法很适合检查数据对齐情况。
小结
我使用 merge 时一般会按这个顺序做:
- 先检查键字段类型。
- 再检查键字段是否重复。
- 明确使用
left、inner还是outer。 - 合并后检查行数是否符合预期。
- 用缺失值和
_merge找出没有匹配上的记录。
表格合并最怕结果“看起来能跑”,但其实行数已经错了。把检查步骤固定下来,比事后从统计结果里倒查问题更省时间。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













