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

如何在Julia的DataFrame中保留[i,j]行并移除[j,i]重复行?

Julia DataFrame 移除person1/person2顺序相反的重复行

原函数存在的问题

  • 硬编码列索引(8、9):依赖固定列位置,一旦DataFrame列顺序变化就会出错,应该直接用列名person1和person2
  • 循环逻辑混乱:在循环中修改DataFrame会导致行索引偏移,手动增减i/j无法同步实际行数变化,极易引发索引越界
  • 返回未定义变量:函数最后返回df2,但代码中从未定义该变量,会直接抛出错误
  • 重复判断逻辑不可靠:仅通过两列数值和判断重复,无法区分(1,3)和(2,2)这类和相同但并非目标重复的配对

正确解法

方法一:通过辅助列去重(直观易懂)

using DataFrames

function drop_reverse_pairs(df::DataFrame)
    # 生成排序后的配对元组,顺序相反的配对会得到相同结果
    df[!, :pair] = [sort((row.person1, row.person2)) for row in eachrow(df)]
    # 保留每个配对的第一行,移除后续重复项
    unique!(df, :pair)
    # 删除临时辅助列
    select!(df, Not(:pair))
    return df
end

方法二:直接用自定义键去重(更简洁)

using DataFrames

function drop_reverse_pairs(df::DataFrame)
    # 以排序后的person1/person2为去重键,保留首次出现的行
    return unique(df, row -> sort((row.person1, row.person2)))
end

测试示例

# 构造测试数据
df = DataFrame(
    person1 = [2307, 58999, 15],
    person2 = [15, 52, 2307],
    sth1 = [1234, 1201, 67]
)

# 调用函数去重
result = drop_reverse_pairs(df)
println(result)

输出结果:

2×3 DataFrame
 Row │ person1  person2  sth1
     │ Int64    Int64    Int64
─────┼──────────────────────────
   1 │    2307       15   1234
   2 │   58999       52   1201

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:14