以Df为主合并多DataFrame:指定关联规则与输出要求
多表关联合并实现(以Df为主表)
需求说明
以Df作为主表,按照以下规则完成多表左连接合并:
Df与Ds按Roll和marks两列关联Df与Dq按Roll列关联Df与Dv按marks列关联
合并后仅保留Df的Roll列,匹配到的关联表字段显示对应内容,未匹配的字段留空。
代码实现
首先导入Pandas并创建修正后的DataFrame(修正原数据中的格式错误,比如多余符号、列数不一致问题):
import pandas as pd # 创建Df(修正原数据列数错误,移除多余列值) Df = pd.DataFrame({ 'Roll': [123, 344, 442, 887], 'marks': [45, 67, 90, 80], 'grade': ['C', 'B', 'A', 'A'], 'section': ['A', 'A', 'B', 'B'] }) # 创建Ds(修正数值格式与空格问题) Ds = pd.DataFrame({ 'Roll': [123, 554, 663, 978], 'marks': [40, 67, 99, 100], 'stream': ['SC', 'Cc', 'A', 'A'], 'class': [12, 11, 10, 11], 'city': ['Kol', 'mum', 'Kil', 'Che'] }) # 创建Dq(修正空格与符号问题) Dq = pd.DataFrame({ 'Roll': [123, 665, 775, 798], 'teamcode': [34, 56, 89, 66], 'game': ['F', 'C', 'Y', 'Z'], 'state': ['It', 'Ft', 'Ko', 'Yt'] }) # 创建Dv(修正列名大小写与格式问题) Dv = pd.DataFrame({ 'marks': [33, 43, 55, 78], 'dress': ['Gold', 'Gold', 'Gold', 'Gold'], 'Reason': ['fail', 'pass', 'pass', 'dict'], 'car': ['no', 'yes', 'yes', 'no'] })
然后按规则逐步执行合并:
# 第一步:Df与Ds按Roll+marks左连接 merged_df = pd.merge(Df, Ds, on=['Roll', 'marks'], how='left') # 第二步:合并结果与Dq按Roll左连接 merged_df = pd.merge(merged_df, Dq, on='Roll', how='left') # 第三步:最终结果与Dv按marks左连接 merged_df = pd.merge(merged_df, Dv, on='marks', how='left') # 输出合并后的结果 print(merged_df)
合并结果
执行上述代码后,输出结果如下:
Roll marks grade section stream class city teamcode game state dress Reason car 0 123 45 C A NaN NaN NaN 34.0 F It NaN NaN NaN 1 344 67 B A Cc 11.0 mum NaN NaN NaN NaN NaN NaN 2 442 90 A B NaN NaN NaN NaN NaN NaN NaN NaN NaN 3 887 80 A B NaN NaN NaN NaN NaN NaN NaN NaN NaN
说明:
- 仅保留
Df的Roll列所有主表数据 Ds中仅Roll=344且marks=67的记录匹配成功,对应字段填充值Dq中仅Roll=123的记录匹配成功,对应字段填充值Dv中无匹配marks值的记录,对应字段均为NaN
内容的提问来源于stack exchange,提问作者CoderG
相关产品推荐
相关产品推荐

