python - python将交互数据合并成一行
问题描述
我有一个 .csv 数据集,其中包含关于第二个人进行交互的 rfid 数据:
tag_me 是人 1 的变量,tag_them 是你在那一秒遇到的人的名字,time_local_s 是交互发生的时间。rfid 在 19:00:00 开始记录,因此第一次交互记录在 19:22:36(19:00:00 + 1356 秒)。
tag_me,tag_them,time_local_s
0x597E5627,0x3C992634,1356
0x597E5627,0x3C992634,1360
0x597E5627,0x3C992634,1361
0x597E5627,0x3C992634,1362
0x597E5627,0x3C992634,1363
0x597E5627,0x7DA8FFB0,1364
0x597E5627,0x3C992634,1365
0x597E5627,0x3C992634,1365
0x597E5627,0x3C992634,1366
0x597E5627,0x7DA8FFB0,1366
0x597E5627,0x36570942,1366
0x597E5627,0x3C3A21AD,1369
0x597E5627,0x06497CA4,1370
0x597E5627,0x06497CA4,1372
0x597E5627,0x06497CA4,1372
0x597E5627,0x06497CA4,1374
0x597E5627,0x06497CA4,1374
0x597E5627,0x064F5882,1379
我想将每个交互归为一行,记录交互开始、结束的时间以及所用的时间。因此我可以过滤某个阈值(两个 rfid 互相看到 2 秒当然不是真正的交互。
tag_me,tag_them,time_start,time_end,total_time
0x597E5627,0x3C992634,1356,1363,7
0x597E5627,0x7DA8FFB0,1364,1363,1
0x597E5627,0x3C992634,1365,1366,1
0x597E5627,0x7DA8FFB0,1366,1366,1
0x597E5627,0x36570942,1366,1366,1
0x597E5627,0x3C3A21AD,1369,1369.1
0x597E5627,0x06497CA4,1370,1374,4
0x597E5627,0x064F5882,1379,1379,1
到目前为止我试过这个:
data = []
with open('timemerger.csv') as f:
for line in f:
data.append(line)
past_interactions = []
interactions = []
now = -1
new_data = []
for line in enumerate(data):
if line["time_local_s"] > now:
for tag_them, indices in past_interactions:
if tag_them not in data:
interactions.append(entry["tag_them"])
---------------编辑 2018 年 7 月 5 日----------
import pandas as pd
df = pd.read_csv('filter20seconden1.csv')
cols = df.columns.difference(['time_start', 'time_end'])
grps = df.time_start.sub(df.time_end.shift()).gt(20).cumsum()
gpby = df.groupby(grps)
new = gpby.agg(dict(time_start='min',
time_end='max')).join(gpby[cols].sum())
解决方案
正如您在评论中提到的那样,您不介意使用pandas
,这是一种解决方案。有点长,可能有更有效的方法,但我认为它有效:
import pandas as pd
# Read in your csv
df = pd.read_csv('timemerger.csv')
# Create a new column with an "interaction number"
df = df.assign(interaction_num=(df.tag_them != df.tag_them.shift()).cumsum())
# Groupby the interaction number, and extract the min and max times:
gb = (df.groupby('interaction_num')
.apply(
lambda x: pd.Series([x['time_local_s'].min(),
x['time_local_s'].max()]
))
.rename(columns={0:'time_start', 1:'time_end'}))
# Merge the min and max times per interaction number with your original dataframe:
df = df.merge(gb, left_on = 'interaction_num', right_index=True)
# Create a new column for length of time, groupby interaction again, and take first value:
df = (df.assign(total_time = df.time_end - df.time_start)
.groupby('interaction_num')
.first()
.drop('time_local_s', axis=1))
# Finally, save your dataframe:
df.to_csv('output.csv', index=None)
您的新产品output.csv
将如下所示:
tag_me,tag_them,time_start,time_end,total_time
0x597E5627,0x3C992634,1356,1363,7
0x597E5627,0x7DA8FFB0,1364,1364,0
0x597E5627,0x3C992634,1365,1366,1
0x597E5627,0x7DA8FFB0,1366,1366,0
0x597E5627,0x36570942,1366,1366,0
0x597E5627,0x3C3A21AD,1369,1369,0
0x597E5627,0x06497CA4,1370,1374,4
0x597E5627,0x064F5882,1379,1379,0
请注意,当交互在同一秒开始和结束时有零,而您想要的结果是1
. 这很容易通过df.replace({'total_time':{0:1}}, inplace=True)
在您之前使用来更改to_csv
(我将其保留在那里,因为我认为否则您的数据将失去零秒交互与 1 秒交互之间的差异)。
细分:
第一个assign()
并.shift()
为单独的交互创建一列:
tag_me tag_them time_local_s interaction_num
...
3 0x597E5627 0x3C992634 1362 1
4 0x597E5627 0x3C992634 1363 1
5 0x597E5627 0x7DA8FFB0 1364 2
6 0x597E5627 0x3C992634 1365 3
7 0x597E5627 0x3C992634 1365 3
...
然后,.groupby
andlambda
函数获取交互的min
andmax
次数,并将其重命名为time_start
and time_end
:
time_start time_end
interaction_num
1 1356 1363
2 1364 1364
3 1365 1366
4 1366 1366
...
然后,您将结果groupby
与原始数据框合并,其中interaction_num
与索引匹配,结果是:
...
3 0x597E5627 0x3C992634 1362 1 1356 1363
4 0x597E5627 0x3C992634 1363 1 1356 1363
5 0x597E5627 0x7DA8FFB0 1364 2 1364 1364
6 0x597E5627 0x3C992634 1365 3 1365 1366
7 0x597E5627 0x3C992634 1365 3 1365 1366
...
assign
最后,您一次又一次地创建一列时差groupby
interaction_num
,并删除不必要的'time_local_s'
列,获得最终的数据帧。
推荐阅读
- ios - 将 APN 上传到 Firebase 控制台失败 - “没有为此应用存储团队 ID”
- javascript - HTML 输入类型文件打开服务器文件
- javascript - 为什么会话正常工作并且在一些不活动之后,突然间一切都破裂了?
- javascript - 成功发送 DM 时回复
- sql - 如何用选定的单词替换句子中的单词?
- python - Pandas 对具有相同大小响应的组应用函数
- php - 如何验证多种格式的日期
- java - 为“Step”作用域 bean 编写 JUnit 测试 - 没有为作用域名称“step”注册作用域(Spring Batch 3.0.10)
- azure - 如何将 Azure 成本和使用数据发送到日志分析工作区或直接发送到 Azure 指标?
- android - 观察和绑定对象 Android MVVM