Отбрасывать около одинаковых строк на основе разницы значений - PullRequest
4 голосов
/ 26 апреля 2020

привет, у меня есть 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

Ответы [ 3 ]

2 голосов
/ 26 апреля 2020

Вам нужно будет проверить два условия, чтобы сохранить строку или нет:

  • Разница относительно первой в каждой группе больше, чем 0.5
  • Строка не первая в группе

Для этого вы можете определить оба условия и объединить их в цепочку с помощью 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
1 голос
/ 26 апреля 2020

Вы можете сделать эту простую вещь:

  • 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
0 голосов
/ 26 апреля 2020

Я нашел свой путь, используя этот подход, но он кажется немного грязным

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...