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

Python 根据值差,删除接近相同的行,python,pandas,dataframe,Python,Pandas,Dataframe,您好,我有一个熊猫数据框(大约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时删除行。 我的数据没有排序 在这个微型案例中,我要寻找的结果是得到这个数据帧:

您好,我有一个熊猫数据框(大约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

您必须检查两个条件才能保持一行或不保持一行:

  • 每组中第一个的差异大于
    0.5
  • 该行不是组中的第一行

为此,您可以定义这两个条件并使用
按位或
链接它们:

m1 = df.Distance.sub(df.groupby('Date').Distance.transform('first')).abs().gt(.5)
m2 = ~df.Date.duplicated()

df[m1|m2]

         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

你可以做一件简单的事情:

  • 日期列上的GroupBy。这将满足重复日期的需要
  • 获取组内所有行的
    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]: 
         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

我找到了使用这种方法的方法,但它似乎有点混乱

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):
    if (date == date_s) & (abs(distance-distance_s)<0.5):
        return False
    else:
        return True

df['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)
df=df.sort_值(['Date','Distance']))
df['Date_'s']=df['Date'].班次(+1)
df['Distance_'s']=df['Distance'].移位(+1)
def删除副本附近的副本(距离、距离、日期、日期):

如果(日期==日期)和(abs(距离)为了快速反应,你应该提供你所尝试的,这不是我的工作,答案是帮助的。不要忘了你可以投票和接受答案。看,谢谢!你考虑过任何一种建议的方法吗?是的,两个都在小例子中工作,但是没有扩展的一个,也许你应该考虑澄清这个问题,因为它们似乎不存在。o回答本帖中的问题。