Pandas Column (список) на столбцы и строки - PullRequest
0 голосов
/ 16 мая 2019

У меня есть датафрейм с заказами WooCommerce. в этом DataFrame у меня есть идентификатор заказа и позиции. отдельные позиции - это список товаров в формате json (опять же со списками), цены и количество:

[
{u'sku': u'100111', u'total_tax': u'1.11', u'product_id': 4089, u'price': 15.878505, u'tax_class': u'reduced-rate', u'variation_id': 6627, u'taxes': [{u'total': u'1.111495', u'subtotal': u'1.111495', u'id': 35}], u'name': u'prod2', u'meta_data': [{u'value': u'100501', u'id': 74675, u'key': u'SKU'}], u'subtotal_tax': u'1.11', u'total': u'15.88', u'subtotal': u'15.88', u'id': 9956, u'quantity': 1}, 
{u'sku': u'100222', u'total_tax': u'2.29', u'product_id': 4081, u'price': 32.700935, u'tax_class': u'reduced-rate', u'variation_id': 6632, u'taxes': [{u'total': u'2.289065', u'subtotal': u'2.289065', u'id': 35}], u'name': u'prod1', u'meta_data': [{u'value': u'100302', u'id': 74685, u'key': u'SKU'}], u'subtotal_tax': u'2.29', u'total': u'32.70', u'subtotal': u'32.70', u'id': 9957, u'quantity': 1}
] 

Теперь мне нужно преобразовать все элементы списка в столбцы в кадре данных, а также мне нужно сделать n строк (исходя из количества списков в списке) из этого одного элемента.

У вас, ребята, есть умная идея?

Спасибо! е.

// редактировать: это мой вклад:

id    line_items
1234  [{u'sku': u'100111'}, {u'sku': u'100222'}] 

мой ожидаемый результат будет

id, sku
1234, 100111
1234, 100222

Ответы [ 2 ]

1 голос
/ 04 июня 2019

pandas.io.json.json_normalize может автоматически распаковывать вложенные структуры. Ниже приведен код для вашего примера.

from pandas.io.json import json_normalize

df = pd.DataFrame({"id": [1234], "line_items": [[{u'sku': u'100111'}, {u'sku': u'100222'}]]})

dict_df = df.to_dict(orient="records")
df = json_normalize(dict_df, record_path="line_items", meta=["id"])

Выход

      sku   id
0  100111  1234
1  100222  1234

Возможно, вам потребуется изменить порядок столбцов выходных данных.

1 голос
/ 03 июня 2019

Вам нужно будет объединить словари в новый DataFrame.Вот эффективное понимание, которое вы можете использовать для этого:

pd.DataFrame(
    [{'id': Y, **x} for Y, X in zip(df['id'], df['line_items']) for x in X ])

     id     sku
0  1234  100111
1  1234  100222

Предполагается, что "line_items" - это столбец, содержащий список словарей.Если это не так (если это строка), вы можете сначала преобразовать его, используя

import ast
df['line_items'] = df['line_items'].map(ast.literal_eval)

Другая альтернатива - chain ing:

from itertools import chain
from operator import itemgetter 

pd.DataFrame({
    'sku': list(
        map(itemgetter('sku'), chain.from_iterable(df['line_items'].tolist()))), 
    'id': df['id'].values.repeat(df['line_items'].str.len())})

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