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

