使用自定义逻辑删除重复项

时间:2017-01-16 22:30:36

标签: pandas duplicates

我有一个pandas数据帧,结构如下:

df:
x      y      z1       z2        z3
1.01  2.01   11.415   12.345    100
1.009 2.009  11.415   12.345    100
1.01  2.05   11.415   12.345    100

列x和y是用一些噪声测量的。我的工作是去除重复"数据帧w.r.t列z1,z2,z3使得列x和y中的条目不是"远"彼此。在上面的设计示例中,前两行(第1行和第2行)是重复的,在z列中具有相同的条目,并且合理地使用x和y"关闭"。请注意,第3行(最后一行)也具有相同的条目,但具有y值" far"远离其他两排(2.05 vs 2.01)。我有逻辑来确定什么算是"远"并且"关闭"对于列x和y。

我正在寻找一种干净的方法来做到这一点。我尝试了窗口应用程序和使用group by等,但似乎没有什么工作得很好。感谢。

2 个答案:

答案 0 :(得分:1)

一种方法是创建一个列,标记x和y“足够接近”的行,然后相应地删除重复项。

df['duplicate'] = df[[x, y]].apply(lambda items: 1*(np.abs(items[0]-items[0]) <= 1.0), axis=1)
df_fltr = pd.concat((df[df.duplicate == 1].drop_duplicates(subset=['z1', 'z2', 'z3']),
                     df[df.duplicate == 0]))

更好(因为它可能更快)你可以使用矢量化方法来创建标签:

df['duplicate'] = ((df.x - df.y).abs() <= 1.0)*1

答案 1 :(得分:1)

您可以使用pd.cut将对象转换为分箱类别,然后使用.duplicated查找重复项:

z = x.apply(lambda col: pd.cut(col, np.arange(min(col), max(col)+0.01, 0.005), right = False))
z
    x   y   z1  z2  z3
0   [1.009, 1.014)  [2.009, 2.014)  [11.415, 11.42) [12.345, 12.35) [100, 100.005)
1   [1.009, 1.014)  [2.009, 2.014)  [11.415, 11.42) [12.345, 12.35) [100, 100.005)
2   [1.009, 1.014)  [2.049, 2.054)  [11.415, 11.42) [12.345, 12.35) [100, 100.005)

x[~z.duplicated()]

x   y   z1  z2  z3
0   1.01    2.01    11.415  12.345  100
2   1.01    2.05    11.415  12.345  100

更改np.arange(min(col), max(col)+0.01, 0.005)以适合您预定义的贴近度参数