У меня есть фрейм данных, в котором хранятся данные временных рядов пользователей в системе, например:
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 *?