如何用Python Pandas合并customer_orders与order_products两个DataFrame?
首先先确认你提供的customer_orders DataFrame,我把它的代码和结构再列出来方便参考:
import pandas as pd customer_orders = pd.DataFrame( {'customerID': [1, 2, 2, 1], 'customerName': ['John', 'Anna', 'Anna', 'John'], 'customerAge': [21, 45, 45, 21], 'orderID': [255, 256, 257, 258], 'paymentType': ['visa', 'bank', 'master', 'paypal']} )
它的结构如下:
customerAge customerID customerName orderID paymentType
0 21 1 John 255 visa
1 45 2 Anna 256 bank
2 45 2 Anna 257 master
3 21 1 John 258 paypal
接下来我假设你的order_products是包含订单对应产品信息的DataFrame,先构造一个贴近业务场景的示例:
order_products = pd.DataFrame( {'orderID': [255, 256, 257, 259], 'productName': ['Laptop', 'Phone', 'Tablet', 'Headphones'], 'quantity': [1, 2, 1, 3]} )
现在可以用Pandas的merge()函数来合并这两个DataFrame,核心是找到关联键(这里是orderID),再根据需求选择合适的合并类型。
1. 内连接(Inner Join)
这是默认的合并方式,只保留两个DataFrame中关联键都存在的行:
merged_inner = pd.merge(customer_orders, order_products, on='orderID')
结果只会包含orderID为255、256、257的行——因为259在customer_orders里不存在,258在order_products里不存在,都会被过滤掉。
2. 左连接(Left Join)
保留左表(这里是customer_orders)的所有行,右表(order_products)中匹配的行会被合并,没有匹配的列会填充NaN:
merged_left = pd.merge(customer_orders, order_products, on='orderID', how='left')
结果里会保留orderID=258的行,对应的productName和quantity列会显示NaN。
3. 右连接(Right Join)
和左连接逻辑相反,保留右表(order_products)的所有行,左表中没有匹配的列填充NaN:
merged_right = pd.merge(customer_orders, order_products, on='orderID', how='right')
结果里会保留orderID=259的行,对应的客户相关列(比如customerName、customerAge)都会显示NaN。
4. 外连接(Outer Join)
保留两个DataFrame的所有行,没有匹配的列统一用NaN填充:
merged_outer = pd.merge(customer_orders, order_products, on='orderID', how='outer')
结果会包含所有5个orderID(255、256、257、258、259),缺失数据的位置都会用NaN补全。
额外实用技巧
- 如果两个表的关联键名称不一样,可以用
left_on和right_on分别指定,比如左表是order_id、右表是orderID,写法为:pd.merge(df1, df2, left_on='order_id', right_on='orderID') - 如果需要按多个键合并,只需把
on的值改成列表即可,比如on=['customerID', 'orderID'](适合需要同时匹配客户和订单的场景)
内容的提问来源于stack exchange,提问作者lordy

