Julia中DataFrame去重报错:如何保留目标行并移除重复项?
问题解决:DataFrame镜像重复行去重
错误原因
你之前的代码错误在于minmax仅支持两个参数,但你一次性传入了[:p1, :p2, :s1, s2]四个列,导致ByRow(minmax)尝试将四个值传给minmax,触发参数不匹配的方法错误。
解决方案
针对你的需求(去除(p1,p2)互换且对应(s1,t1)/(s2,t2)镜像重复的行),需要分组处理成对的列,分别生成有序标识后再去重:
方法1:直接在unique中定义多组转换规则
unique(df, [ # 将p1、p2转换为有序元组,统一镜像对的标识 [:p1, :p2] => ByRow(minmax), # 将(s1,t1)、(s2,t2)两个元组转换为有序对,统一镜像行的时间标识 [:s1, :t1, :s2, :t2] => ByRow((s1,t1,s2,t2) -> minmax((s1,t1), (s2,t2))) ])
方法2:先添加辅助列再去重(更直观)
using DataFrames, Pipe df_clean = @pipe df |> # 添加辅助列:生成p1/p2的有序对、(s1,t1)/(s2,t2)的有序元组对 transform( [:p1, :p2] => ByRow(minmax) => :p_pair, [:s1, :t1, :s2, :t2] => ByRow((s1,t1,s2,t2) -> minmax((s1,t1), (s2,t2))) => :st_pair ) |> # 基于辅助列去重 unique([:p_pair, :st_pair]) |> # 移除辅助列,保留原结构 select(Not([:p_pair, :st_pair]))
效果说明
两种方法都会保留第1行,且在第2、3行中保留其中一行,实现镜像重复行的去重。
内容的提问来源于stack exchange,提问作者Chao
相关产品推荐
相关产品推荐

