python - Python - 可能的循环函数来跟踪一个人的整个时间的运动并将其与其他人分组?
问题描述
我的问题是,我想全程跟踪 ID,查看他们接下来要去的地方,并将他们与其他人分组为他们的第一个位置点。我目前正在使用 excel 按日期和 ID 进行排序。按日期排序时,我知道每个人第一次访问某个地点时去了哪里。如果我随后删除了这些 ID 的第一个实例,我将离开它们的下一个位置。然后我删除这些实例等等。
这是一个示例数据集:
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 数据集(去掉第一行):
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
然后,我们可以使用自定义 sort() 以您想要的方式对数据进行排序:
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']
可以使用 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 文件
推荐阅读
- python - Pandas Drop 部分重复
- android - Xamarin Android 错误 - 内置错误
- bash - 在某个 XML 标记中将小写更改为大写
- python - 令人困惑的 SQLite3 错误
- javascript - AngularJS 待办事项列表应用程序 - 在页面刷新时保持列表
- c# - 将实例化网格保持在屏幕中央?
- java - 在 GraalVM native-image 中从 Java 代码运行 JS 脚本
- python - Keras/Tensorflow:通道顺序优先和损失函数轴 -1
- android - 更新后修改 SharedPreferences Array
- go - 通过注入类型查找切片元素的模式