首页 > 解决方案 > python将字典转换为数据框

问题描述

我尝试将 json 转换为数据框,但找不到我想要的

这是我得到的字典和结果

{'20210df12820df1456-ssddsd': {'2': {'num': '2',
                                     'product_name': 'apple',
                                     'product_price': '20900'},
                               'order': {'add_info': None,
                                         'basket_count': '2',
                                         'deli_price': '2500',
                                         'id': 'nhdd@abvc',
                                         'is_member': 'MEMBER',
                                         'mem_type': 'PERSON',
                                         'order_date': '2021-01-28 20:14:56',
                                         'ordernum': '20210df12820df1456-ssddsd',
                                         'pay_price': '43100',
                                         'reserve': '840',
                                         'start_price': '43100',
                                         'total_product_price': '41800',
                                         'used_emoney': '0',
                                         'used_reserve': '0'},
                               'pay_history': [{'add_price': '0',
                                                'deli_price': '2500',
                                                'discount_price': '-1200',
                                                'order_price': '43100',
                                                'pay_date': '2021-01-28 '
                                                            '20:15:14',
                                                'pay_price': '43100',
                                                'pay_type': 'creditcard',
                                                'paymethod': 'C',
                                                'total_price': '41800',
                                                'used_emoney': '0',
                                                'used_reserve': '0'}],
                               'payment': {'card_flag': '0000',
                                           'card_partcancel_code': '00',
                                           'card_state': 'Y',
                                           'in_card_price': '43100',
                                           'pay_date': '2021-01-28 20:15:14',
                                           'pay_status': 'Y',
                                           'paymethod': 'C',
                                           'simple_pay': 'NPY'},
                               'product': {'1': {'num': '1',
                                                 'product_name': 'banana',
                                                 'product_price': '20900'}}}}
json_data = response.json()
result =json_data['list']
df = pd.DataFrame(result).transpose()
df.head()

我想把这个字典变成四个数据框。但我有这个结果

在此处输入图像描述

我期望像下面

order = df[['order']]
payment = df[['payment']]
pay_history = df[['pay_history']]
product = df[['product']]

像这样的东西。

有任何想法吗??

标签: pythonpandasdictionary

解决方案


由于每个类别的数据(订单、付款、支付历史、产品)的组织方式不同,您应该考虑遍历每个类别,添加额外的数据(例如ordernum用于索引目的)并将它们放入自己的列表中,以便稍后使用将它们转换为DataFrame对象

import pandas as pd

json_data = {'20210df12820df1456-ssddsd': {'order': {'ordernum': '20210df12820df1456-ssddsd', 'order_date': '2021-01-28 20:14:56', 'is_member': 'MEMBER', 'start_price': '43100', 'pay_price': '43100', 'deli_price': '2500', 'total_product_price': '41800', 'basket_count': '2', 'id': 'nhdd@abvc', 'mem_type': 'PERSON', 'used_emoney': '0', 'used_reserve': '0', 'add_info': None, 'reserve': '840'}, 'payment': {'paymethod': 'C', 'pay_date': '2021-01-28 20:15:14', 'card_state': 'Y', 'pay_status': 'Y', 'simple_pay': 'NPY', 'card_flag': '0000', 'card_partcancel_code': '00', 'in_card_price': '43100'}, 'pay_history': [{'pay_date': '2021-01-28 20:15:14', 'pay_type': 'creditcard', 'total_price': '41800', 'deli_price': '2500', 'discount_price': '-1200', 'add_price': '0', 'order_price': '43100', 'pay_price': '43100', 'used_reserve': '0', 'used_emoney': '0', 'paymethod': 'C'}], 'product': {'1': {'num': '1', 'product_name': 'banana', 'product_price': '20900'}, '2': {'num': '2', 'product_name': 'apple', 'product_price': '20900'}}}}

order_data = []
payment_data = []
pay_history_data = []
product_data = []

for key in json_data:
    order_data.append(json_data[key]['order'])

    payment = dict(json_data[key]['payment'])
    payment['ordernum'] = key
    pay_history_data.append(payment)

    pay_history = json_data[key]['pay_history']
    if 'pay_history' in json_data[key]:
        for p in pay_history:
            p_clone = dict(p)
            p_clone['ordernum'] = key
            payment_data.append(p_clone)

    product = json_data[key]['product']
    if 'product' in json_data[key]:
        for product_key in product:
            p_clone = dict(product[product_key])
            p_clone['ordernum'] = key
            product_data.append(p_clone)

order_df = pd.DataFrame(order_data)
payment_df = pd.DataFrame(payment_data)
pay_history_df = pd.DataFrame(pay_history_data)
product_df = pd.DataFrame(product_data)

编辑:如果您KeyError在迭代时遇到异常pay_history,可能是在某些顺序中,pay_history该顺序的 json 数据中没有键,因此您可以通过在继续之前检查 json 文件中是否存在该键来避免这种情况遍历pay_history( ),在遍历( )if 'pay_history' in json_data[key]:之前可以做同样的事情。productif 'product' in json_data[key]:


推荐阅读