在R中匹配多列并从另一数据集提取Shipped字段值
解决月末销售数据集匹配提取问题
问题背景
现有两份月末销售数据集,需完整保留数据集A的所有行,并从数据集B中提取对应订单的Shipped字段值。使用merge或match函数时,出现值不匹配或数据集行数异常膨胀的问题。真实数据集包含100+列、约50万行,以下为示例数据:
数据集A
| First Name | Last Name | Order | Shipped |
|---|---|---|---|
| John | S | 300 | Y |
| Tim | B | 331 | Y |
| Kathy | J | 365 | N |
| Clayton | S | 362 | Y |
| Ashley | R | 364 | N |
| John | A | 321 | N |
| John | S | 388 | Y |
| Ashley | R | 338 | N |
数据集B
| First Name | Last Name | Order | Shipped |
|---|---|---|---|
| John | S | 300 | Y |
| Tim | B | 331 | N |
| Kathy | J | 365 | N |
| Clayton | S | 362 | Y |
| Ashley | R | 364 | Y |
| John | A | 321 | Y |
| Jake | K | 333 | N |
| Bobby | J | 398 | N |
期望输出
| First Name | Last Name | Order | Shipped A | Shipped B |
|---|---|---|---|---|
| John | S | 300 | Y | Y |
| Tim | B | 331 | Y | N |
| Kathy | J | 365 | N | N |
| Clayton | S | 362 | Y | Y |
| Ashley | R | 364 | N | Y |
| John | A | 321 | N | Y |
| John | S | 388 | Y | N/A |
| Ashley | R | 338 | N | N/A |
解决方案(基于Pandas)
针对大数据量(50万行),采用**左连接(Left Join)**是最优方案,既能完整保留A的所有行,又能避免数据集膨胀,核心是指定唯一的匹配键(First Name+Last Name+Order,这三个字段组合可唯一标识订单)。
代码实现
import pandas as pd # 读取数据集(根据实际格式调整,如Excel用pd.read_excel) df_a = pd.read_csv('dataset_a.csv') df_b = pd.read_csv('dataset_b.csv') # 重命名Shipped列,避免合并后列名冲突 df_a.rename(columns={'Shipped': 'Shipped A'}, inplace=True) df_b.rename(columns={'Shipped': 'Shipped B'}, inplace=True) # 执行左连接:以A的行基准,匹配B中相同订单的记录 merged_df = pd.merge( df_a, df_b[['First Name', 'Last Name', 'Order', 'Shipped B']], # 仅保留需要的列,提升效率 on=['First Name', 'Last Name', 'Order'], how='left' ) # 将缺失值替换为N/A merged_df['Shipped B'] = merged_df['Shipped B'].fillna('N/A') # 调整列顺序,与期望输出一致 merged_df = merged_df[['First Name', 'Last Name', 'Order', 'Shipped A', 'Shipped B']] # 输出或保存结果 print(merged_df) # merged_df.to_csv('matched_result.csv', index=False)
关键说明
- 匹配键选择:必须用
First Name+Last Name+Order组合作为匹配键,若仅用部分字段(如仅Order),可能因订单号重复导致笛卡尔积(行数膨胀)。 - 左连接逻辑:
how='left'确保保留A的所有行,B中无匹配的行自动填充NaN,后续替换为N/A即可。 - 性能优化:合并时仅从B中提取需要的列(避免加载100+列),提升大数据量下的处理速度。
内容的提问来源于stack exchange,提问作者Trae
相关产品推荐
相关产品推荐

