Манипулировать данными заказов JSON с помощью панд - PullRequest
0 голосов
/ 09 января 2019

У меня есть данные JSON заказа, которые выглядят следующим образом:

[
    {
        "id": 640197558336,
        "line_items": [
            {
                "id": 1501742661696,
                "variant_id": 19490901426240,
                "title": "\"Acrylic Bag\"",
                "quantity": 1
            },
            {
                "id": 1501742661695,
                "variant_id": 19490901426245,
                "title": "\"Trash Can\"",
                "quantity": 2
            }
        ]
    },
    {
        "id": 640197558337,
        "line_items": [
            {
                "id": 1501742661699,
                "variant_id": 19490901426249,
                "title": "\"Sports headphones\"",
                "quantity": 5
            },
            {
                "id": 1501742661695,
                "variant_id": 19490901426245,
                "title": "\"Trash Can\"",
                "quantity": 6
            }
        ]
    }
]

Я использовал pandas, чтобы прочитать json и просмотреть его как фрейм данных, см. Ниже:

import pandas as pd

desired_width = 920
file_name = "trimmedorders"
file_ext = ".json"
pd.set_option('display.width', desired_width)

df = pd.read_json(file_name+file_ext,orient='columns')
df.head()

кадр данных выглядит следующим образом:

enter image description here

Может кто-нибудь помочь мне перевести его в следующий формат:

enter image description here

любая помощь / предложение в этом отношении приветствуется. Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Использование pd.io.json.json_normalize и meta + record_path ключевых слов:

from pandas.io.json import json_normalize

df = pd.concat([
    json_normalize(row, record_path=["line_items"], record_prefix="line_item_", meta="id")
        for row in data
])

>> print(df)

    line_item_id  line_item_quantity      line_item_title  \
0  1501742661696                   1        "Acrylic Bag"   
1  1501742661695                   2          "Trash Can"   
0  1501742661699                   5  "Sports headphones"   
1  1501742661695                   6          "Trash Can"   

   line_item_variant_id            id  
0        19490901426240  640197558336  
1        19490901426245  640197558336  
0        19490901426249  640197558337  
1        19490901426245  640197558337  

Обратите внимание, что это дороже, чем решение @ Rakesh, поскольку json_normalize возвращает DataFrame каждый раз.

0 голосов
/ 09 января 2019

Одним из способов является предварительная обработка JSON.

Ex:

import pandas as pd

data = [{"id": i["id"], "line_items_id": j["id"], "line_items_variant_id": j["variant_id"], 
         "line_items_title": j["title"], "line_items_quantity": j["quantity"]}  for i in data for j in i["line_items"]]

df = pd.DataFrame(data)
print(df)

Выход:

             id  line_items_id  line_items_quantity     line_items_title  \
0  640197558336  1501742661696                    1        "Acrylic Bag"   
1  640197558336  1501742661695                    2          "Trash Can"   
2  640197558337  1501742661699                    5  "Sports headphones"   
3  640197558337  1501742661695                    6          "Trash Can"   

   line_items_variant_id  
0         19490901426240  
1         19490901426245  
2         19490901426249  
3         19490901426245  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...