左连接DataFrame:无需手动指定列,如何生成目标输出?
问题描述
现有两个DataFrame:df_1:
| my_id | col_1 | col_2 | col_3 |
|---|---|---|---|
| 10001 | 1 | 2 | 3 |
| 10002 | 6 | 1 | 3 |
| 10003 | 7 | 2 | 7 |
| 10004 | 9 | 3 | 4 |
| 10005 | 1 | 2 | 8 |
| 10006 | 1 | 9 | 5 |
df_2:
| my_new_id | col_4 | col_5 | col_final |
|---|---|---|---|
| 10005 | 1 | 2 | 10 |
| 10006 | 6 | 1 | 10 |
期望生成的输出DataFrame df_output:
| my_id | col_1 | col_2 | col_3 | col_final |
|---|---|---|---|---|
| 10005 | 1 | 2 | 8 | 10 |
| 10006 | 1 | 9 | 5 | 10 |
需求限制:
- 以较小的
df_2为左表做左连接 df_1包含数十列,不想手动指定所有需要的列- 当前尝试的代码未保留
col_final,需修正
当前尝试的代码:
df_output = df_2.join(df_1.select("col_1", "col_2", "col_3"), df_2["my_new_id"] == df_1["my_id"], how="left").drop('my_new_id')
解决方案
核心思路
- 先清理
df_2,只保留关联键my_new_id和需要保留的col_final,避免引入多余列 - 直接关联完整的
df_1,无需手动指定列,解决df_1列数过多的问题 - 最后移除冗余列并调整列顺序得到目标结构
实现代码
基础版本(适合列顺序固定的场景)
# 筛选df_2中需要的列:关联键和col_final df_2_clean = df_2.select("my_new_id", "col_final") # 左连接完整的df_1,关联条件匹配ID df_joined = df_2_clean.join(df_1, df_2_clean["my_new_id"] == df_1["my_id"], how="left") # 移除冗余的my_new_id,按目标顺序选择列 df_output = df_joined.drop("my_new_id").select("my_id", "col_1", "col_2", "col_3", "col_final")
动态列版本(适配df_1列数多、列名不固定的场景)
如果df_1的列很多且不需要手动罗列,可动态生成目标列列表:
df_2_clean = df_2.select("my_new_id", "col_final") df_joined = df_2_clean.join(df_1, df_2_clean["my_new_id"] == df_1["my_id"], how="left") # 动态获取df_1的所有列,加上col_final作为目标列 target_cols = df_1.columns.tolist() + ["col_final"] df_output = df_joined.drop("my_new_id").select(target_cols)
内容的提问来源于stack exchange,提问作者johnnydoe
相关产品推荐
相关产品推荐

