基于参考DataFrame合并Python字典中的DataFrame
问题描述
我有一个名为frames1的DataFrame字典,其键为:
dict_keys(['TableA','TableB','TableC','TableD'])
同时有一个master DataFrame指定合并规则,如下表所示:
| Gold Table | Silver Table 1 | Silver Table 2 | Join Type | Left_Attr | Right_Attr |
|---|---|---|---|---|---|
| System | Table A | Table B | left | ID | applic_id |
| System | Table C | Table A | right | fam | famid |
| System | Table A | Table D | left | NameID | name |
最终的System表需要按行依次合并:先将Table A与Table B按指定属性左连接,结果作为新的Table A参与Table C与Table A的右连接,再将该结果作为新的Table A与Table D左连接。
我尝试的代码如下:
for i in range(len(master)): System = pd.merge(frames1[master.iloc[i,1]],frames1[master.iloc[i,2]], how=master.iloc[i,3], on_left= master.iloc[i,4],on_right=master.iloc[i,5])
但该代码每次循环都会覆盖结果,仅得到单次合并的结果。请问如何编写循环实现逐步合并?
解决方案
你的问题核心是每次循环都直接重新赋值System,没有把上一次的合并结果作为下一次合并的输入,另外还要注意master里的表名带空格(比如Table A),但frames1的键是不带空格的TableA,需要先做替换处理。
可以按以下步骤实现逐步合并:
- 先初始化合并结果,同时更新
frames1中的TableA为每次合并后的结果,因为后续步骤都需要用这个新的TableA参与合并。 - 循环遍历
master的每一行,按规则执行合并并更新TableA。
示例代码如下:
import pandas as pd # 处理master中的表名空格,匹配frames1的键格式 master['Silver Table 1'] = master['Silver Table 1'].str.replace(' ', '') master['Silver Table 2'] = master['Silver Table 2'].str.replace(' ', '') # 执行第一次合并:TableA与TableB左连接 current_df = pd.merge( frames1[master.iloc[0, 1]], frames1[master.iloc[0, 2]], how=master.iloc[0, 3], left_on=master.iloc[0, 4], right_on=master.iloc[0, 5] ) # 更新frames1的TableA为第一次合并结果 frames1['TableA'] = current_df # 遍历剩余的合并步骤 for i in range(1, len(master)): # 提取当前行的合并规则 left_tab = master.iloc[i, 1] right_tab = master.iloc[i, 2] join_mode = master.iloc[i, 3] left_col = master.iloc[i, 4] right_col = master.iloc[i, 5] # 执行合并,使用最新的TableA current_df = pd.merge( frames1[left_tab], frames1[right_tab], how=join_mode, left_on=left_col, right_on=right_col ) # 更新TableA为当前合并结果,供下一次使用 frames1['TableA'] = current_df # 最终的System表即为current_df System = current_df
关键说明
- 表名匹配:通过
str.replace(' ', '')把master里的Table A转为TableA,确保能正确从frames1中取出对应DataFrame。 - 结果累积:每次合并后更新
frames1中的TableA,这样后续循环里用到TableA时,都是上一次合并后的最新结果,不会被覆盖。 - 分步执行:第一次合并单独初始化结果,后续循环处理剩余步骤,逻辑清晰且符合需求中的合并顺序。
内容的提问来源于stack exchange,提问作者BB123
相关产品推荐
相关产品推荐

