根据值差异删除接近相同的行

你好,我有一个可以这样总结的 pandas 数据框(大约 1000 行):


     Date      Distance

0   2014-08-13   5.9

1   2014-08-17   10.7

2   2014-08-13   6.2

3   2014-08-20   13.7

4   2014-08-13   8.8

5   2014-08-17   10.9


当日期相同并且两行之间的距离差小于 0.5 时,我想删除行。我的数据没有排序


在这个微型案例中,我正在寻找的结果是取回这个数据框:


     Date      Distance

0   2014-08-13   5.9

1   2014-08-17   10.7

3   2014-08-20   13.7

4   2014-08-13   8.8

索引 2 已被删除,因为它与索引 0 的日期相同,并且两个距离之间的差异小于 0.5 。


索引 5 已被删除,它与索引 1 的日期相同,并且两个距离之间的差异小于 0.5


我对如何有效地解决这个问题一无所知。谢谢你的帮助 !


编辑:我之前的例子不够清楚。它不与特定日期的第一个距离(或最小距离)进行比较。它在特定日期的任意两个距离之间。


这个例子可能更明确:


     Date      Distance

0   2014-08-13   5.9

1   2014-08-17   10.7

2   2014-08-13   6.2

3   2014-08-20   13.7

4   2014-08-13   8.8

5   2014-08-17   10.9

6   2014-08-13   3.3

7   2014-08-13   3.6

8   2014-08-13   3.5

9   2014-08-13   1.7

它应该返回:


     Date      Distance

0   2014-08-13   5.9

1   2014-08-17   10.7

3   2014-08-20   13.7

4   2014-08-13   8.8

6   2014-08-13   3.3

9   2014-08-13   1.7


猛跑小猪
浏览 110回答 3
3回答

偶然的你

您必须检查两个条件才能保持一行:相对于每组第一名的差异大于0.5该行不是组中的第一行为此,您可以定义这两个条件并用 a 链接它们bitwise OR:m1 = df.Distance.sub(df.groupby('Date').Distance.transform('first')).abs().gt(.5)m2 = ~df.Date.duplicated()df[m1|m2]         Date  Distance0  2014-08-13       5.91  2014-08-17      10.73  2014-08-20      13.74  2014-08-13       8.8

动漫人物

我找到了使用这种方法的方法,但看起来有点乱df = df.sort_values(['Date','Distance'])df['Date_s'] = df['Date'].shift(+1)df['Distance_s'] = df['Distance'].shift(+1)def remove_near_duplicate(distance,distance_s,date,date_s):&nbsp; &nbsp; if (date == date_s) & (abs(distance-distance_s)<0.5):&nbsp; &nbsp; &nbsp; &nbsp; return False&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; return Truedf['To_drop'] = df.apply(lambda row : remove_near_duplicate(row['Distance'],row['Distance_s'],row['Date'],row['Date_s']),axis=1)df = df[df['To_drop']==True]df.drop(columns=['To_drop','Date_s','Distance_s'],inplace=True)

汪汪一只猫

你可以做这个简单的事情:GroupBy 在Date列上。这将迎合重复的日期。获取diff组内的所有行。选择diff大于Nan或等于的行0.5命令:In [43]: df['diff'] = df.groupby('Date')['Distance'].diff()In [47]: df[(df['diff'].isna()) | df['diff'].ge(0.5)].drop('diff', 1)Out[47]:&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Date&nbsp; Distance0&nbsp; 2014-08-13&nbsp; &nbsp; &nbsp; &nbsp;5.91&nbsp; 2014-08-17&nbsp; &nbsp; &nbsp; 10.73&nbsp; 2014-08-20&nbsp; &nbsp; &nbsp; 13.74&nbsp; 2014-08-13&nbsp; &nbsp; &nbsp; &nbsp;8.8
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python