为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

猛跑小猪 2022-10-25 10:16:13
你好,我有一个可以这样总结的 pandas 数据框(大约 1000 行):     Date      Distance0   2014-08-13   5.91   2014-08-17   10.72   2014-08-13   6.23   2014-08-20   13.74   2014-08-13   8.85   2014-08-17   10.9当日期相同并且两行之间的距离差小于 0.5 时,我想删除行。我的数据没有排序在这个微型案例中,我正在寻找的结果是取回这个数据框:     Date      Distance0   2014-08-13   5.91   2014-08-17   10.73   2014-08-20   13.74   2014-08-13   8.8索引 2 已被删除,因为它与索引 0 的日期相同,并且两个距离之间的差异小于 0.5 。索引 5 已被删除,它与索引 1 的日期相同,并且两个距离之间的差异小于 0.5我对如何有效地解决这个问题一无所知。谢谢你的帮助 !编辑:我之前的例子不够清楚。它不与特定日期的第一个距离(或最小距离)进行比较。它在特定日期的任意两个距离之间。这个例子可能更明确:     Date      Distance0   2014-08-13   5.91   2014-08-17   10.72   2014-08-13   6.23   2014-08-20   13.74   2014-08-13   8.85   2014-08-17   10.96   2014-08-13   3.37   2014-08-13   3.68   2014-08-13   3.59   2014-08-13   1.7它应该返回:     Date      Distance0   2014-08-13   5.91   2014-08-17   10.73   2014-08-20   13.74   2014-08-13   8.86   2014-08-13   3.39   2014-08-13   1.7
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超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  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


查看完整回答
反对 回复 2022-10-25
?
动漫人物

TA贡献1815条经验 获得超10个赞

我找到了使用这种方法的方法,但看起来有点乱


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)


查看完整回答
反对 回复 2022-10-25
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

你可以做这个简单的事情:

  • 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]: 

         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


查看完整回答
反对 回复 2022-10-25
  • 3 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信