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
相关产品推荐
相关产品推荐

