【问题标题】:Alternative To Storing List in Pandas DataFrame在 Pandas DataFrame 中存储列表的替代方案
【发布时间】: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?,一种方法是声明一个带有空列表的新字段,然后在每个 leaveenter 记录处,对列表进行替换。

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


【解决方案1】:

您可以将列表保存为字符串S

L=[1,2,3,4,5] 
S=str(L)  

根据后续分析的工作流程,您可以将字符串转回整数数组(或列表)

np.array(S.split('[')[1].split(']')[0].split(', '), dtype=int) 

这里是 ipython shell 上的一个 sn-p

In [1]: import numpy as np                                                                                                                                                                                             

In [2]: L=[1,2,3,4,5]                                                                                                  

In [3]: S=str(L)                                                                                                       

In [4]: S                                                                                                              
Out[4]: '[1, 2, 3, 4, 5]'

In [5]: np.array(S.split('[')[1].split(']')[0].split(', '), dtype=int)                                                 
Out[5]: array([1, 2, 3, 4, 5])

In [6]: list(np.array(S.split('[')[1].split(']')[0].split(', '), dtype=int) )                                          
Out[6]: [1, 2, 3, 4, 5]

【讨论】:

    猜你喜欢
    • 2022-12-22
    • 2018-08-21
    • 2013-11-24
    • 2016-12-07
    • 2014-07-30
    • 2022-10-24
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多