【发布时间】:2020-08-16 08:12:58
【问题描述】:
我有一个数据框存储系统中用户的时间序列数据,例如:
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]
我的问题是,然后我将对不同的状态进行分析(表中有更多数据点),并且基于列表对字段进行查找和过滤似乎不可靠和/或计算成本高。
我想到的另一种选择是将不同的状态存储在字典中,每次我在数据中遇到新组合时,将其作为 值 添加到字典中并自动递增 key 并为每个状态提供一个可以存储在数据框中的 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”的方式?
【问题讨论】:
-
我不确定您为什么认为将其存储为列表会是
unreliable。我明白你对效率的担忧。根据下游分析所需的内容,也许将状态存储为set会比list更有效,或者 numpy 数组可能会成为正确的容器。您能否使用您尝试优化的特定下游分析步骤的更多详细信息更新问题,并且由于这是一个与性能相关的问题,可能是求解器在呈现解决方案时可以参考的稍大的数据集(在 pastebin 中)。
标签: python pandas list data-science