Извлечь ключ и значение из json в новый фрейм данных - PullRequest
0 голосов
/ 16 октября 2019

У меня есть фрейм данных со значениями JSON в столбцах. Они были врезаны в несколько уровней. Я хотел бы извлечь конечный ключ и значение в новый фрейм данных. Я приведу примеры значений столбцов ниже

{'shipping_assignments': [{'shipping': {'address': {'address_type': 'shipping', 'city': 'Calder','country_id': 'US', 'customer_address_id': 1, 'email': 'roni_cost@example.com', 'entity_id': 1, 'firstname': 'Veronica', 'lastname': 'Costello', 'parent_id': 1,' почтовый индекс ':' 49628-7978 ',' region ':' Michigan ',' region_code ':' MI ',' region_id ': 33,' street ': [' 6146 Honey Bluff Parkway '],'phone ':' (555) 229-3326 '},' method ':' flatrate_flatrate ',' total ': {' base_shipping_amount ': 5,' base_shipping_discount_amount ': 0,' base_shipping_discount_tax_compensation_amnt ': 0,' base_shipping_incl_tax ': 5'base_shipping_invoiced': 5, 'base_shipping_tax_amount': 0, 'shipping_amount': 5, 'shipping_discount_amount': 0, 'shipping_discount_tax_compensation_amount': 0, 'shipping_incl_tax': 5, 'shipping_invoiced': 5, 'shipping_tax }amount'items': [{'amount_refunded': 0, 'apply_rule_ids': '1', 'base_amount_refunded': 0, 'base_discount_количество ': 0,' base_discount_invoiced ': 0,' base_discount_tax_compensation_amount ': 0,' base_discount_tax_compensation_invoiced ': 0,' base_original_price ': 29,' base_price ': 29,' base_price_incl_tax ': 29_in__row__row__row__row__row__row__row__row___t___t___t___t___t___t__21: 29, «base_row_total_incl_tax»: 31,39, «base_tax_amount»: 2,39, «base_tax_invoiced»: 2,39, «create_at»: «2019-09-27 10:03:45», «discount_amount»: 0, «discount_invoiced»: 0,«discount_percent»: 0, «free_shipping»: 0, «discount_tax_compensation_amount»: 0, «discount_tax_compensation_invoiced»: 0, «is_qty_decimal»: 0, «item_id»: 1, «name»: «Iris Workout Top», «no_discount»:0, 'order_id': 1, 'original_price': 29, 'price': 29, 'price_incl_tax': 31.39, 'product_id': 1434, 'product_type': 'configurable', 'qty_canceled': 0, 'qty_invoiced':1, 'qty_ordered': 1, 'qty_refunded': 0, 'qty_shipped': 1, 'row_invoiced': 29, 'row_total': 29, 'row_total_incl_tax': 31.39, 'row_weight': 1, 'sku': 'WS03-XS-Red ',' store_id ': 1,' tax_amount ': 2.39,' tax_invoiced ': 2.39, 'tax_percent': 8.25, 'updated_at': '2019-09-27 10:03:46', 'weight': 1, 'product_option': {'extension_attributes': {'configurable_item_options': [{'option_id':' 141 ',' option_value ': 167}, {' option_id ':' 93 ',' option_value ': 58}]}}}]}],' payment_additional_info ': [{' key ':' method_title ','значение': 'Чек / Денежный перевод'}], 'apply_taxes': [{'code': 'US-MI- -Rate 1', 'title': 'US-MI- -Rate1 ',' процентов ': 8,25,' сумма ': 2,39,' base_amount ': 2,39}],' item_applied_taxes ': [{' type ':' product ',' apply_taxes ': [{' code ':' US-MI- -Rate 1 ',' title ':' US-MI- -Rate 1 ',' процентов ': 8,25,' сумма ': 2,39,' base_amount ': 2,39}]}],'converting_from_quote ': True}

Выше одно столбцовое значение столбца данных df [' x ']

Ниже приведены мои коды для преобразования

sample = data['x'].tolist()
data = json.dumps(sample)
df = pd.read_json(data)

он дает новый фрейм данных со столбцами

Индекс (['apply_taxes', 'converting_from_quote', 'item_applied_taxes', 'payment_additional_info', 'shipping_assignments'], dtype = 'object')

Когда я попытался сделать то же самое выше, чтобы преобразовать столбец со значениями строки

m_df = df['applied_taxes'].apply(lambda x : re.sub('.?\[|$.|]',"", str(x)))
m_sample = m_df.tolist()
m_data = json.dumps(m_sample)
c_df = pd.read_json(m_data)

Это не работает

Проверьте эту ссылку, чтобы получить beautified_json

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Я наткнулся на красивый пакет ETL на python, который называется petl. преобразовать список json в форму dict с помощью функции fromdicts (json_string)

order_table = fromdicts(data_list)

Если вы найдете какой-либо вложенный dict в любом из столбцов, используйте unpackdict (order_table, 'nested_col'), который будет распакованвложенный диктВ моем случае мне нужно распаковать столбец apply_tax. Приведенный ниже код распакует и добавит ключ и значение в виде столбца и строки в той же таблице.

order_table  = unpackdict(order_table, 'applied_taxes')

Если вы, ребята, хотите узнать больше о - petl

0 голосов
/ 16 октября 2019

Кажется, ваша ошибка была в tolist(). Попробуйте следующее:

import pandas as pd
import json
import re

data = {"shipping_assignments":[{"shipping":{"address":{"address_type":"shipping","city":"Calder","country_id":"US","customer_address_id":1,"email":"roni_cost@example.com","entity_id":1,"firstname":"Veronica","lastname":"Costello","parent_id":1,"postcode":"49628-7978","region":"Michigan","region_code":"MI","region_id":33,"street":["6146 Honey Bluff Parkway"],"telephone":"(555) 229-3326"},"method":"flatrate_flatrate","total":{"base_shipping_amount":5,"base_shipping_discount_amount":0,"base_shipping_discount_tax_compensation_amnt":0,"base_shipping_incl_tax":5,"base_shipping_invoiced":5,"base_shipping_tax_amount":0,"shipping_amount":5,"shipping_discount_amount":0,"shipping_discount_tax_compensation_amount":0,"shipping_incl_tax":5,"shipping_invoiced":5,"shipping_tax_amount":0}},"items":[{"amount_refunded":0,"applied_rule_ids":"1","base_amount_refunded":0,"base_discount_amount":0,"base_discount_invoiced":0,"base_discount_tax_compensation_amount":0,"base_discount_tax_compensation_invoiced":0,"base_original_price":29,"base_price":29,"base_price_incl_tax":31.39,"base_row_invoiced":29,"base_row_total":29,"base_row_total_incl_tax":31.39,"base_tax_amount":2.39,"base_tax_invoiced":2.39,"created_at":"2019-09-27 10:03:45","discount_amount":0,"discount_invoiced":0,"discount_percent":0,"free_shipping":0,"discount_tax_compensation_amount":0,"discount_tax_compensation_invoiced":0,"is_qty_decimal":0,"item_id":1,"name":"Iris Workout Top","no_discount":0,"order_id":1,"original_price":29,"price":29,"price_incl_tax":31.39,"product_id":1434,"product_type":"configurable","qty_canceled":0,"qty_invoiced":1,"qty_ordered":1,"qty_refunded":0,"qty_shipped":1,"row_invoiced":29,"row_total":29,"row_total_incl_tax":31.39,"row_weight":1,"sku":"WS03-XS-Red","store_id":1,"tax_amount":2.39,"tax_invoiced":2.39,"tax_percent":8.25,"updated_at":"2019-09-27 10:03:46","weight":1,"product_option":{"extension_attributes":{"configurable_item_options":[{"option_id":"141","option_value":167},{"option_id":"93","option_value":58}]}}}]}],"payment_additional_info":[{"key":"method_title","value":"Check / Money order"}],"applied_taxes":[{"code":"US-MI-*-Rate 1","title":"US-MI-*-Rate 1","percent":8.25,"amount":2.39,"base_amount":2.39}],"item_applied_taxes":[{"type":"product","applied_taxes":[{"code":"US-MI-*-Rate 1","title":"US-MI-*-Rate 1","percent":8.25,"amount":2.39,"base_amount":2.39}]}],"converting_from_quote":"True"}

df = pd.read_json(json.dumps(data))
m_df = df['applied_taxes'].apply(lambda x : re.sub('.?\[|$.|]',"", str(x)))
c_df = pd.read_json(json.dumps(list(m_df)))
print(c_df)

напечатает следующее:

                                                   0
0  {'code': 'US-MI-*-Rate 1', 'title': 'US-MI-*-R...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...