Python—跟踪一个人的可能循环函数';在整个时间里,你的运动是什么,并将它与其他人分组?
我的问题是,我想全程跟踪ID,看看他们下一步会去哪里,并将他们与其他人分组作为他们的第一个位置点。目前我正在使用excel按日期和ID排序。按日期排序时,我知道每个人第一次访问某个地点的地点。如果我删除了这些ID的第一个实例,那么剩下的就是它们的下一个位置。然后删除这些实例,依此类推 以下是一个示例数据集:Python—跟踪一个人的可能循环函数';在整个时间里,你的运动是什么,并将它与其他人分组?,python,pandas,numpy,Python,Pandas,Numpy,我的问题是,我想全程跟踪ID,看看他们下一步会去哪里,并将他们与其他人分组作为他们的第一个位置点。目前我正在使用excel按日期和ID排序。按日期排序时,我知道每个人第一次访问某个地点的地点。如果我删除了这些ID的第一个实例,那么剩下的就是它们的下一个位置。然后删除这些实例,依此类推 以下是一个示例数据集: ID Location Date 76 School 4/12/2018 111 Post Office 4/15/2018 112 School 4/10/2
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
输出应该有一个新的列,其中它根据ID的第一个位置(按日期)对ID进行分组,然后第二个组应该是这些相同的人下一个旅行的地方,等等
任何帮助都将不胜感激。我知道如何将文件加载到python之类的程序中,但就我的一生而言,我在为上述程序创建函数时遇到了难以置信的麻烦。再次感谢您的帮助 假设我们有一个您提到的CSV数据集(去掉第一行): 然后,我们可以使用自定义排序()按您想要的方式对数据进行排序:
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和日期排序):
可以使用for循环将组添加到此输出中:
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文件中假设我们有您提到的CSV数据集(去掉第一行): 然后,我们可以使用自定义排序()按您想要的方式对数据进行排序:
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和日期排序):
可以使用for循环将组添加到此输出中:
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文件中以下是我使用熊猫的答案。假设您有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
以下是我使用熊猫的答案。假设您有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
您应该查看自定义排序,将其保存在列表中,并使用id和日期对其进行排序。我是在excel中这样做的。我遇到的障碍是在处理数千个ID时。我必须手动按每个成员ID分配一个组,总共分配5000个ID,然后将所有ID分组在一起。我知道可以用python创建函数,但我遇到了一个障碍。@Logan不知道我是否理解,为什么ID=112在组中有两个1,是因为ID 112去了两个地方的日期相同吗?@Ben.T正确!可能存在这样的情况:一个ID选择在同一天去多个地方,这可能会导致一些问题。您应该查看自定义排序,将其保存在列表中,并使用ID和日期对其进行排序。我在excel中这样做了。我遇到的障碍是在处理数千个ID时。我必须手动按每个成员ID分配一个组,总共分配5000个ID,然后将所有ID分组在一起。我知道可以用python创建函数,但我遇到了一个障碍。@Logan不知道我是否理解,为什么ID=112在组中有两个1,是因为ID 112去了两个地方的日期相同吗?@Ben.T正确!可能有这样的情况,一个ID选择在同一天去多个地方,这可能会导致一些问题。我注意到关于ID 112的日期在这里发生了变化。图书馆和学校的ID应为2018年3月23日,将此人归入第1组。否则,剩下的看起来不错。不知道怎么解决。@Logan这是我的错别字,当复制你的数据集时,我做了一个booboo,我注意到这里的日期改变了,ID是112。图书馆和学校的ID应为2018年3月23日,将此人归入第1组。否则,剩下的看起来不错。不知道该如何解决。@Logan那是我的错别字,在复制你的数据集时,我做了一个boobootboot,感谢你注意到我的错误。谢谢你的回答!很好的答案,感谢索引对齐,您甚至可以直接使用
df['Rank']=df.sort_values('Date').groupby('ID')['Date'].Rank(method='dense')
,而无需创建gdf,也无需在前面排序df,也无需在后面连接和排序_索引;)谢谢你的评论。这很有道理,而且会提高可读性。谢谢你注意到我的错误。谢谢你的回答!很好的答案,感谢索引对齐,您甚至可以直接使用df['Rank']=df.sort_values('Date').groupby('ID')['Date'].Rank(method='dense')
,而无需创建gdf,也无需在前面排序df,也无需在后面连接和排序_索引;)谢谢你的评论。这确实很有意义,而且会提高可读性。