簡體   English   中英

在 Pandas DataFrame 中存儲列表的替代方法

[英]Alternative To Storing List in Pandas DataFrame

我有一個 dataframe 存儲系統中用戶的時間序列數據,例如:

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 個玩家,系統 state 為(1,2,3,4,5) 在 09:55:00,系統 state 更改為(1,3,4,5,6)

參考這篇文章, pandas.DataFrame 可以有列表類型列嗎? ,一種方法是用一個空列表聲明一個新字段,然后在每次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]

我的問題是,然后我將對不同的狀態進行分析(表中有更多的數據點),並且基於列表對字段進行查找和過濾似乎不可靠和/或計算成本高.

我想到的另一種選擇是將不同的狀態存儲在字典中,每次我在數據中遇到新組合時,將其作為添加到字典中並自動遞增並為每個 state 提供一個可以存儲的 ID在 dataframe 中(以下代碼未經測試,僅用於示例目的):

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 背景,這就是為什么我的直覺是將 state “ID”存儲在數據框中的原因。 有沒有更有效或更“pythonic”的方式?

您可以將列表保存為字符串S

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

根據接下來的分析工作流程,您可以將字符串轉回整數數組(或列表)

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

這是 ipython shell 上的一個片段

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM