python - 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']]
像这样的东西。
有任何想法吗??
解决方案
由于每个类别的数据(订单、付款、支付历史、产品)的组织方式不同,您应该考虑遍历每个类别,添加额外的数据(例如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]:
之前可以做同样的事情。product
if 'product' in json_data[key]:
推荐阅读
- kubernetes - 如何使用部署定义 pod 的副本名称?
- python - Seaborn Barplot 上的色调
- templates - 尝试在 Shopify 中使用 Liquid 模板连接表单输入
- nlp - 预训练的 FastText 如何处理多词查询?
- javascript - 基于来自另一个数组(非静态)的键的对象子集数组,然后过滤
- bootstrap-4 - Bootstrap 4 从不同的行和列更改动态高度卡顺序
- string - 标识符 sstream 未定义?
- python - 几乎在那里:给定一个整数 n,如果 n 在 100 或 200 的 10 以内,则返回 True
- powerbi - 计算每个子组在动态时间段内的行数
- mysql - 创建索引时在查询期间丢失与 MySQL 服务器的连接