Python - Возможна ли функция l oop для отслеживания движения человека во времени и группировки его с другими? - PullRequest
0 голосов
/ 29 марта 2020

Моя проблема в том, что я хотел бы отслеживать идентификаторы во времени, видеть, где они go рядом, и группировать их с другими для их первой точки местоположения. В данный момент я использую Excel для сортировки по дате и идентификатору. Когда отсортировано по дате, я знаю, куда отправились отдельные люди для своего первого посещения места. Если я затем удалю первые экземпляры этих идентификаторов, у меня останется следующее место, где они go. Затем я удаляю эти экземпляры и так далее, и так далее.

Вот пример набора данных:

ID  Location    Date
76  School      4/12/2018
111 Post Office 4/15/2018
112 School      4/10/2018
324 School      2/10/2018
22  Library     4/12/2018
19  Library     4/13/2028
17  Post Office 5/11/2018
76  Library     4/25/2018
19  Library     4/27/2019
112 School      3/23/2018
76  Post Office 4/27/2018
113 Ice Cream   5/23/2018
19  School      7/23/2019
112 Library     3/23/2018
76  Ice Cream   6/4/2019
112 Fountain    6/10/2019

Вот ожидаемый результат:

ID  Location    Date       Group
76  School      4/12/2018  1
111 Post Office 4/15/2018  1
112 School      4/10/2018  2
324 School      2/10/2018  1
22  Library     4/12/2018  1
19  Library     4/13/2028  1 
17  Post Office 5/11/2018  1
76  Library     4/25/2018  2
19  Library     4/27/2019  2
112 School      3/23/2018  1
76  Post Office 4/27/2018  3
113 Ice Cream   5/23/2018  1
19  School      7/23/2019  1
112 Library     3/23/2018  1
76  Ice Cream   6/4/2019   4
112 Fountain    6/10/2019  3

В выводе должен быть новый столбец, в котором он группирует идентификаторы по первому место (по дате), а затем вторая группа должна быть там, где те же люди путешествовали дальше, и т. д. c.

Любая помощь будет признательна. Я знаю, как загрузить файл в python и тому подобное, но на всю жизнь я испытываю невероятные трудности с созданием функции для вышеперечисленного. Еще раз спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вот мой ответ, используя pandas. Предполагая, что у вас есть данные в CSV-файле, мы можем сделать следующее:

import pandas as pd

df = pd.read_csv('Sample.csv')
gdf = pd.DataFrame()

#Change to datetime for rank operation
df.Date = pd.to_datetime(df.Date)
df = df.sort_values('Date')

# Rank by date and do a dense rank to avoid same date as same rank
gdf['Rank'] = df.groupby('ID')['Date'].rank(method='dense')
result = df.join(gdf)

# Sort to match original order of table
result = result.sort_index()

print(result)

     ID    Location       Date  Rank
0    76      School 2018-04-12   1.0
1   111  PostOffice 2018-04-15   1.0
2   112      School 2018-04-10   2.0
3   324      School 2018-02-10   1.0
4    22     Library 2018-04-12   1.0
5    19     Library 2018-04-13   1.0
6    17  PostOffice 2018-05-11   1.0
7    76     Library 2018-04-25   2.0
8    19     Library 2019-04-27   2.0
9   112      School 2018-03-23   1.0
10   76  PostOffice 2018-04-27   3.0
11  113    IceCream 2018-05-23   1.0
12   19      School 2019-07-23   3.0
13  112     Library 2018-03-23   1.0
14   76    IceCream 2019-06-04   4.0
15  112    Fountain 2019-06-10   3.0

Примечание: я думаю, что в ваших результатах есть небольшая ошибка для этой строки:

19  School      7/23/2019  1
1 голос
/ 30 марта 2020

Предположим, у нас есть набор данных CSV, как вы упомянули (без первой строки):

76  School      4/12/2018
111 Post Office 4/15/2018
112 School      4/10/2018
324 School      2/10/2018
22  Library     4/12/2018
19  Library     4/13/2028
17  Post Office 5/11/2018
76  Library     4/25/2018
19  Library     4/27/2019
112 School      3/23/2018
76  Post Office 4/27/2018
113 Ice Cream   5/23/2018
19  School      7/23/2019
112 Library     3/23/2018
76  Ice Cream   6/4/2019
112 Fountain    6/10/2019

Затем мы можем использовать пользовательскую сортировку () для сортировки данных так, как вам нужно:

import csv
import datetime

l = []

with open('stack.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        l.append(row)


l.sort(key = lambda x: (int(x[0]), datetime.datetime.strptime(x[2], '%m/%d/%Y')))
[print(i) for i in l]

Это даст вам следующий вывод (отсортированный по ID и дате):

['17', 'PO', '05/11/2018']
['19', 'L', '04/27/2019']
['19', 'S', '07/23/2019']
['19', 'L', '04/13/2028']
['22', 'L', '04/12/2018']
['76', 'S', '04/12/2018']
['76', 'L', '04/25/2018']
['76', 'IC', '06/04/2019']
['76', 'PO', '04/27/2020']
['111', 'PO', '04/15/2018']
['112', 'S', '02/23/2018']
['112', 'L', '03/23/2018']
['112', 'S', '04/10/2018']
['112', 'F', '06/10/2019']
['113', 'IC', '05/23/2018']
['324', 'S', '02/10/2018']

Добавление группы к этому выводу может быть выполнено с использованием для l oop:

f_id = l[0][0]
group = 1
for i in l:
    if f_id != i[0]:
        group = 1
        f_id = i[0]
    i.append(group)
    group+=1

Это даст вам ваш вывод:

['17', 'PO', '05/11/2018', 1]
['19', 'L', '04/27/2019', 1]
['19', 'S', '07/23/2019', 2]
['19', 'L', '04/13/2028', 3]
['22', 'L', '04/12/2018', 1]
['76', 'S', '04/12/2018', 1]
['76', 'L', '04/25/2018', 2]
['76', 'IC', '06/04/2019', 3]
['76', 'PO', '04/27/2020', 4]
['111', 'PO', '04/15/2018', 1]
['112', 'S', '02/23/2018', 1]
['112', 'L', '03/23/2018', 2]
['112', 'S', '04/10/2018', 3]
['112', 'F', '06/10/2019', 4]
['113', 'IC', '05/23/2018', 1]
['324', 'S', '02/10/2018', 1]

Затем вы можете записать этот список обратно в файл CSV с вашими заголовками

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...