Как перебрать значения словаря и добавить их в виде строк в соответствующий фрейм данных? - PullRequest
0 голосов
/ 28 февраля 2019

В настоящее время у меня есть словарь, в котором идентификатор пользователя хранится в качестве ключа, а события, которые он выполняет, в виде списка кортежей.Каждый кортеж содержит дату, когда событие было выполнено, и само событие.

Вот выдержка из словаря:

{
 '56d306892fcf7d8a0563b488bbe72b0df1c42f8b62edf18f68a180eab2ca7dc5': 
  [('2018-10-24T08:30:12.761Z', 'booking_initialized')],
 'ac3406118670ef98ee2e3e76ab0f21edccba7b41fa6e4960eea10d2a4d234845': 
  [('2018-10-20T14:12:35.088Z', 'visited_hotel'), ('2018-10-20T14:17:38.521Z', 
 'visited_hotel'), ('2018-10-20T14:16:41.968Z', 'visited_hotel'), ('2018-10- 
 20T13:39:36.064Z', 'search_hotel'), ('2018-10-20T13:47:03.086Z', 
 'visited_hotel')], 
 '19813b0b79ec87975e42e02ff34724dd960c7b05efec71477ec66fb04b6bed9c': [('2018- 
 10-10T18:10:10.242Z', 'referal_code_shared')]
}

У меня также есть фрейм данных с соответствующими столбцами:

Columns: [visited_hotel, search_hotel, booking_initialized, creferal_code_shared]

Я хотел сделать итерациюкаждая запись словаря, а затем, соответственно, добавить его в качестве строки в моем фрейме данных.Каждая строка представляет собой число, указывающее, сколько раз пользователь выполнил это событие.

Так, например, после прочтения выдержки из моего словаря мой фрейм данных будет выглядеть следующим образом:

  visited_hotel search_hotel booking_initialized referal_code_shared
0     0             0             1                    0

1     4             1             0                    0

2     0             0             0                    1

Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019
d = {
    '56d306892fcf7d8a0563b488bbe72b0df1c42f8b62edf18f68a180eab2ca7dc5': [('2018-10-24T08:30:12.761Z', 'booking_initialized')],
    'ac3406118670ef98ee2e3e76ab0f21edccba7b41fa6e4960eea10d2a4d234845': [('2018-10-20T14:12:35.088Z', 'visited_hotel'), ('2018-10-20T14:17:38.521Z', 'visited_hotel'), ('2018-10-20T14:16:41.968Z', 'visited_hotel'), ('2018-10-20T13:39:36.064Z', 'search_hotel'), ('2018-10-20T13:47:03.086Z', 'visited_hotel')],
    '19813b0b79ec87975e42e02ff34724dd960c7b05efec71477ec66fb04b6bed9c': [('2018-10-10T18:10:10.242Z', 'referal_code_shared')]
}

def user_actions(user, actions):
    # Convert the actions to dataframe
    df = pd.DataFrame(actions).rename(columns={0: 'timestamp', 1: 'action'})
    # Count each action
    counted = df.groupby(['action'])['timestamp'].agg('count').reset_index().rename(columns={'timestamp': 'counter'})
    # Pivot the result so each action is a column
    pivoted = counted.pivot(columns='action', values='counter')
    return pivoted

# Process each user's actions and concatenate all
all_actions_df = pd.concat([user_actions(user, user_actions_list) for user, user_actions_list in d.items()]).replace(np.nan, 0)

Выход

    booking_initialized referal_code_shared search_hotel    visited_hotel
0   1.0                 0.0                 0.0                 0.0
0   0.0                 0.0                 1.0                 0.0
1   0.0                 0.0                 0.0                 4.0
0   0.0                 1.0                 0.0                 0.0
0 голосов
/ 28 февраля 2019
from collections import Counter
import pandas as pd

# d is your dictionary of values

result = {user: Counter(x[1] for x in records)
          for user, records in d.items()}
df = pd.DataFrame(result).fillna(0).T.reset_index(drop=True)

Немного более чистый подход

result = {i: Counter(x[1] for x in records)
          for i, records in enumerate(d.values()) }

df = pd.DataFrame(result).fillna(0).T

Если вы хотите, чтобы ваши столбцы были в определенном порядке, то

cols = ['visited_hotel', 'search_hotel', 'booking_initialized', 'referal_code_shared']
df = df.loc[:, cols]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...