Python 根据值差,删除接近相同的行
您好,我有一个熊猫数据框(大约1000行),可以这样概括: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时删除行。 我的数据没有排序 在这个微型案例中,我要寻找的结果是得到这个数据帧:
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回答本帖中的问题。