我有一个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等,但似乎没有什么工作得很好。感谢。
答案 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)
以适合您预定义的贴近度参数