我有一个数据框,用于存储系统中用户的时间序列数据,例如:
time action playerID amount outcome
------------------------------------------------
10:00:00 sell 1 10 win
09:58:10 buy 2 15 lose
09:55:00 leave 2 NaN NaN
09:55:00 enter 6 NaN NaN
我一开始就知道系统中有哪些用户,我正试图找出在每行存储“系统状态”的最佳方法。例如,在开始时,系统中有5个玩家,系统状态为(1,2,3,4,5)
。09:55:00,系统状态更改为(1,3,4,5,6)
引用这篇文章Can pandas.DataFrame have list type column?,一种方法是用空列表声明一个新字段,然后在每个leave
和enter
记录上对列表进行替换
time action playerID amount outcome state
--------------------------------------------------------------
10:00:00 sell 1 10 win [1,2,3,4,5]
09:58:10 buy 2 15 lose [1,2,3,4,5]
09:55:00 leave 2 NaN NaN [1,3,4,5]
09:55:00 enter 6 NaN NaN [1,3,4,5,6]
我的问题是,然后我将对不同的状态进行分析(表中有更多的数据点),并且根据列表对字段进行查找和筛选似乎不可靠和/或计算成本高昂
我想到的另一种选择是将不同的状态存储在字典中,每次我在数据中遇到新的组合时,将其作为值添加到字典中,并自动递增键,并给每个状态一个可以存储在数据框中的ID(以下代码未经测试,仅用于示例目的):
states = {1:[1,2,3,4,5]}
statesID = 1
state = [1,2,3,4,5]
for i in df:
if i['action'] == 'leave':
state.remove(i['playerID'])
if i['action'] == 'enter':
state.append(i['playerID'])
state = state.sort()
if len(state) == 5 & state not in states.values():
statesID += 1
states[statesID] = statesID
i['state'] = statesID
这种方法的缺点是,我要理解,遍历数据帧是低效的,应该避免
我更多地来自SQL背景,这就是为什么我本能地将状态“ID”存储在数据帧中的原因。有没有更有效或更“pythonic”的方法
您可以将列表另存为字符串
S
根据后续分析的工作流程,您可以将字符串转回整数数组(或列表)
这里是ipython外壳上的一个片段
相关问题 更多 >
编程相关推荐