您的位置:首页 > 其它

Pandas根据差值条件构造辅助列对几十万数据去重处理

2019-04-04 00:07 218 查看

 

最近碰到这样的一个问题:有一对数据t1列,t2列(如下图所示),用pandas读入,这些数据中会存在一个问题:①某一行的t1列值与另一行的t1列值相等,但t2列值的差值小于0.0001;②某一行的t2列值与另一行的t2列值相等,但t1列值的差值小于0.0001。我认为这两种情况是属于重合冗余情况(因为其他数据差别都大于0.0002),想要对数据进行去重,数据量有几十万条。

一开始想要不要用循环遍历比较,但是想想几十万的数据量,而且对于某一行数据,就要拿其他所有的行跟它作比较,这个太耗时间了,后来也在群里问了别人,有人建议我用python的rolling进行滚动计算,也有人说必须循环,还有人说用R语言的filter,但都觉得很麻烦,而且不一定能行,最后想到的是将所有数据同时乘以10的4次方,构造辅助列,然后round取整,使用drop_duplicates辅助列去重可以解决,但是发现,round是四舍五入取整,如0.99998和1.00002这两个数就可以看作重复,但是有些数据比如1.00002和1.00005,就会被分为两类,因此这里面应该还要int取整,因此应将数据前后进行round去重和int去重(顺序可以调换),最终得到正确的结果。

代码如下:

[code]data_final['t11']=(data_final['t1'].astype(np.float32)*1E4).apply(round)
data_final['t21']=(data_final['t2'].astype(np.float32)*1E4).apply(round)
data_final.drop_duplicates(subset=['t11','t21'], keep='first', inplace=True)
data_final=data_final.drop(columns=['t11','t21'])
data_final=data_final.reset_index(drop=True)

data_final['t11']=(data_final['t1'].astype(np.float32)*1E4).apply(int)
data_final['t21']=(data_final['t2'].astype(np.float32)*1E4).apply(int)
data_final.drop_duplicates(subset=['t11','t21'], keep='first', inplace=True)
data_final=data_final.drop(columns=['t11','t21'])
data_final= data_final.reset_index(drop=True)

data_final.to_csv("points.csv",index=False,sep=',')

构造辅助列十分重要,根据辅助列去重复行:

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: