Поиск строки перед каждым изменением координат в CSV через Python - PullRequest
0 голосов
/ 02 декабря 2019

У меня есть CSV с 3 столбцами, один из которых является идентификатором.
Для одного идентификатора значения в одном из столбцов будут повторяться во времени, а затем внезапно изменяться и повторяться снова. Как я могу найти строку для значения перед каждым изменением в python и экспортировать вывод?

Подсказка, почему я не могу найти идентификатор для максимальной отметки времени, - это необходимость в строке или отметке времени после изменения с тем же идентификатором.
Другими словами, выходные данные должны включать только строки, предшествующие изменению в столбце координат.
Если идентификатор не имеет различий в координатах во времени, эти строки не понадобятся для вывода.

Например, поиск полужирных.

ID |Координаты |Отметка времени

101 |90, -1 |2016-01-01 9:00
101 |90, -1 |2016-01-01 9:01
101 |90, -1 |2016-01-01 9:02
101 |90, -2 |2016-01-01 9:03
101 |90, -2 |2016-01-01 9:04
102 |90, -3 |2016-01-01 9:00
102 |90, -3 |2016-01-01 9:01
102 |90, -3 |2016-01-01 9:02
102 |90, -4 |2016-01-01 9:03
102 |90, -4 |2016-01-01 9:04
103 |90, 90 |2016-01-01 9:00
103 |90, 90 |2016-01-01 9:01
103 |90, 90 |2016-01-01 9:02
103 |90, 90 |2016-01-01 9:03
103 |90, 90 |2016-01-01 9:04
103 |90, 90 |2016-01-01 9:05
и т. Д.

1 Ответ

0 голосов
/ 02 декабря 2019

Предполагая, что ваши данные отсортированы по времени, и вы загружаете в свой CSV, используя read_csv, используя панд, вы можете сделать что-то простое, как это:

import pandas as pd

df = pd.DataFrame({'ID': [101, 101, 101, 101, 101, 102, 102, 102, 102, 102,], \
     'Coordinates': [(90, -1), (90, -1), (90, -1), (90, -2), (90, -2), (90, -3), (90, -3), (90, -3), (90, -4), (90, -4)], \
     'Timestamp': ['2016-01-01 9:00', '2016-01-01 9:01', '2016-01-01 9:02', '2016-01-01 9:03', '2016-01-01 9:04', \
                   '2016-01-01 9:00', '2016-01-01 9:01', '2016-01-01 9:02', '2016-01-01 9:03', '2016-01-01 9:04']})
clean_df = df.sort_values('Timestamp').drop_duplicates(subset=['ID', 'Coordinates'], keep='last')
print(clean_df)

    ID Coordinates        Timestamp
7  102    (90, -3)  2016-01-01 9:02
2  101    (90, -1)  2016-01-01 9:02
9  102    (90, -4)  2016-01-01 9:04
4  101    (90, -2)  2016-01-01 9:04

, если вы не возражаете против последнегоуникальное значение.

В качестве альтернативы,

df = pd.DataFrame({'ID': [101, 101, 101, 101, 101, 102, 102, 102, 102, 102,], \
     'Coordinates': [(90, -1), (90, -1), (90, -1), (90, -2), (90, -2), (90, -3), (90, -3), (90, -3), (90, -4), (90, -4)], \
     'Timestamp': ['2016-01-01 9:00', '2016-01-01 9:01', '2016-01-01 9:02', '2016-01-01 9:03', '2016-01-01 9:04', \
                   '2016-01-01 9:00', '2016-01-01 9:01', '2016-01-01 9:02', '2016-01-01 9:03', '2016-01-01 9:04']}).sort_values(by=['ID', 'Coordinates', 'Timestamp'], ascending=False)

new_df = df.loc[df['Coordinates'].shift() != df['Coordinates']]
print(new_df)

7  102    (90, -3)  2016-01-01 9:02
9  102    (90, -4)  2016-01-01 9:04
2  101    (90, -1)  2016-01-01 9:02
4  101    (90, -2)  2016-01-01 9:04
...