Сделать словарь с определенным форматом из панд данных - PullRequest
0 голосов
/ 05 октября 2018

Попытка преобразовать фрейм данных

enter image description here

В словарь с такой конкретной структурой:

    sales = { 
   "clients": [
       {"ID_client": "241341", 
       "purchases": [
            "Item 101",
            "Item 202",
            "Item 324",
        ],
        "payment": [
            "visa", "master", "visa"
        ]           
       },
       {"ID_client": "24356", 
       "purchases": [
            "Item 2320",
            "Item 2342",
            "Item 5604",
        ],
        "payment": [
            "diners", "cash", "diners"
        ]           
       },    
       {"ID_client": "5534", 
       "purchases": [
            "Item 50563",
            "Item 52878",
            "Item 54233",
        ],
        "payment": [
            "diners", "master", "visa"
        ]           
       }       
   ]

}

Я былПопытка с некоторыми для циклов, как:

 d = {"sales":[]}
  for i in df1['ID_Client'].unique():/
     clients = {"ID_client": df1['ID_client'][i]}
     d[i] = [{df1['purchases'][j]: df1['payment'][j]} for j in 
     df1[df1['ID_Client']==i].index]

Любая помощь будет принята с благодарностью.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Я думаю, что вы были на правильном пути с самого начала цикла, но вам будет лучше использовать результаты для фильтрации данных.Должен быть более эффективным и более похожим на панду (пандарен?), Чтобы сделать это таким образом.

Пример:

clients = []
for c in df1['ID_client'].unique():
    client = {
        'ID_client': c, 
        'purchases': list(df1[df1.ID_client == c].loc[:, 'Purchase']), 
        'payment': list(df1[df1.ID_client == c].loc[:, 'Payment'])
    }
    clients.append(client)
0 голосов
/ 06 октября 2018

Предполагая, что ваш источник DataFrame равен df , ваш словарь может быть сгенерирован с помощью инструкции single :

sales = { 'clients' : df.groupby(df.ID_client)\
    .agg(list)\
    .reset_index()\
    .set_axis(['ID_client', 'purchases', 'payment'], axis=1, inplace=False)\
    .to_dict('records')
}

Как выКак видите, создание массива - содержимое клиентов фактически состоит из следующей цепочки:

  • groupby - группа df by ID_client ,
  • agg - объединить все оставшиеся столбцы ( Покупка и Платеж ) в списки значений,на данный момент ID_client является индексом,
  • reset_index , чтобы сделать ID_client обычным столбцом данных,
  • set_axis - изменить имена столбцов (имена целевых компонентов немного отличаются от имен исходных столбцов),
  • to_dict - создать словарь результатов.

Содержимое переменной sales :

{'clients': [{'ID_client': '241341',
   'purchases': ['Item 101', 'Item 202', 'Item 324'],
   'payment': ['visa', 'master', 'visa']},
  {'ID_client': '24356',
   'purchases': ['Item 2320', 'Item 2342', 'Item 5604'],
   'payment': ['diners', 'cash', 'diners']},
  {'ID_client': '5534',
   'purchases': ['Item 50563', 'Item 52878', 'Item 54233'],
   'payment': ['diners', 'master', 'visa']}]}

, как вы хотите.

0 голосов
/ 05 октября 2018

Вот один из способов использования np.repeat и itertools.chain:

import pandas as pd, numpy as np
from itertools import chain

df = pd.DataFrame(sales['clients'])

res = pd.DataFrame({'ID_client': np.repeat(df['ID_client'], df['payment'].map(len)),
                    'payment': list(chain.from_iterable(df['payment'])),
                    'purchases': list(chain.from_iterable(df['purchases']))})

print(res)

  ID_client payment   purchases
0    241341    visa    Item 101
0    241341  master    Item 202
0    241341    visa    Item 324
1     24356  diners   Item 2320
1     24356    cash   Item 2342
1     24356  diners   Item 5604
2      5534  diners  Item 50563
2      5534  master  Item 52878
2      5534    visa  Item 54233

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...