Альтернатива хранению списка в Pandas DataFrame - PullRequest
1 голос
/ 01 мая 2020

У меня есть фрейм данных, в котором хранятся данные временных рядов пользователей в системе, например:

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).

Ссылка на этот пост Может pandas .DataFrame иметь столбец типа списка? , один из способов сделать это чтобы объявить новое поле с пустым списком, а затем в каждой записи 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]

Моя проблема в том, что я тогда сделаю аналитика по различным состояниям (в таблице гораздо больше точек данных), и поиск и фильтрация полей на основе списка кажется ненадежным и / или вычислительно дорогим.

Одна альтернатива I Мы думаем о том, чтобы хранить разные состояния в словаре, каждый раз, когда я сталкиваюсь с новой комбинацией в данных, добавляю ее как значение в словарь и автоматически увеличиваю ключ и присвойте каждому состоянию идентификатор, который можно сохранить в кадре данных (приведенный ниже код не тестируется, только для примера):

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" в фрейме данных. Есть ли более эффективный или более "питонский" способ 1029 *?

1 Ответ

0 голосов
/ 01 мая 2020

Вы можете сохранить список в виде строки S

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

В зависимости от вашего рабочего процесса для последующего анализа вы можете затем превратить строку обратно в массив (или список) целых чисел

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

Здесь фрагмент кода оболочки i python

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...