You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia DataFrames:基于复合键匹配替换DataFrame列值

解决方案

步骤1:清理df2,保留复合键的最后一条记录

先处理df2中的重复复合键,确保每个(col_X, col_Y)组合只保留最后一条记录的col_Z值,用unique函数配合keep=:last参数高效完成:

df2_clean = unique(df2, [:col_X, :col_Y]; keep=:last)

步骤2:左连接df1与清理后的df2

通过左连接关联两个DataFrame,匹配规则为col_A == col_X且col_B == col_Y,这样会保留df1的所有行,匹配成功的行会带上对应的col_Z值:

df_joined = leftjoin(df1, df2_clean, on = [:col_A => :col_X, :col_B => :col_Y])

步骤3:生成最终结果

将连接后的col_Z列重命名为col_C,保留原df1的col_A和col_B列,无匹配的行col_C会自动保留missing:

df1_final = select(df_joined, :col_A, :col_B, :col_Z => :col_C)

完整可运行代码

using DataFrames

# 原始DataFrame定义
df1 = DataFrame(
    col_A = [1, 2, 3, 4, 5, 6, 7],
    col_B = ["A", "B", "C", "D", "E", "F", "G"],
    col_C = missing,
)

df2 = DataFrame(
    col_X = [1, 2, 3, 4, 5, 5],
    col_Y = ["A", "nope", "C", "nope", "E", "E"],
    col_Z = ["First", "Second", "Third", "Fourth", "Fifth", "Duplicated"]
)

# 执行处理流程
df2_clean = unique(df2, [:col_X, :col_Y]; keep=:last)
df_joined = leftjoin(df1, df2_clean, on = [:col_A => :col_X, :col_B => :col_Y])
df1_final = select(df_joined, :col_A, :col_B, :col_Z => :col_C)

# 查看结果
display(df1_final)

执行后得到的结果完全符合需求:

7×3 DataFrame
 Row │ col_A  col_B   col_C      
     │ Int64  String  String?    
─────┼───────────────────────────
   1 │     1  "A"     "First"
   2 │     2  "B"     missing    
   3 │     3  "C"     "Third"
   4 │     4  "D"     missing    
   5 │     5  "E"     "Duplicated"
   6 │     6  "F"     missing    
   7 │     7  "G"     missing    

内容的提问来源于stack exchange,提问作者jn_br

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:40:52