Преобразовать список словарей, содержащих другой список словарей с несколькими значениями, в датафрейм - PullRequest
0 голосов
/ 01 мая 2018

Этот вопрос является дополнением к вопросу, опубликованному на Преобразование списка словарей, содержащих другой список словарей, в фрейм данных

Меня попросили добавить параметр в мой вызов API, и теперь вывод стал немного сложнее, чем выше.

Вывод примерно такой:

insights = [ <Insights> "account_id": "1234",
                    "actions": [{'value': '5', 'action_type': 'add_to_cart', 'view': '5'}],
                    "cust_id": "xyz123",
                    "cust_name": "xyz",
}, <Insights> {
    "account_id": "1234",
    "cust_id": "pqr123",
    "cust_name": "pqr",
},  <Insights> {
    "account_id": "1234",
    "actions": [
        {'click': '8', 'value': '110', 'action_type': 'add_to_cart', 'view': '102'}, {'value': '12', 'action_type': 'purchase', 'view': '12'}
    ],
    "cust_id": "abc123",
    "cust_name": "abc",
 }
 ]

Теперь я хочу, чтобы решение было что-то вроде этого

- account_id a2cart_view a2cart_click pur_view pur_click cust_id cust_name
- 1234                 5                                   xyz123 xyz
- 1234                                                     pqr123 pqr
- 1234               102           8        12             abc123 abc

Я попытался использовать решение по вышеуказанной ссылке, но застрял, когда программа не может найти конкретное значение в одной из строк.

1 Ответ

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

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

df['actions'][df['actions'].isnull()] = df['actions'][df['actions'].isnull()].apply(lambda x: [])

Затем определите функцию find_action с другим параметром what:

def find_action (list_action, action_type, what):
    for action in list_action:
        # for each action, see if the key action_type is the one wanted and what in the keys
        if action['action_type'] == action_type and what in action.keys():
            return action[what]
    # if not the right action type found, then empty
    return ''

Теперь вы можете использовать apply с двумя аргументами:

df['a2cart_view'] = df['actions'].apply(find_action, args=(['add_to_cart','view']))
df['a2cart_click'] = df['actions'].apply(find_action, args=(['add_to_cart','click']))
df['pur_view'] = df['actions'].apply(find_action, args=(['purchase','view']))
df['pur_click'] = df['actions'].apply(find_action, args=(['purchase','click']))

и опустите столбец actions:

df = df.drop('actions',axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...