规范化 json 列并与其余数据框连接
Normalize json column and join with rest of dataframe
这是我在 Whosebug 上的第一个问题,所以请不要烤我。
我试图在互联网上找到类似的问题,实际上有几个,但对我来说,解决方案没有用。
我创建了这个数据框:
import pandas as pd
from ast import literal_eval
d = {'order_id': [1], 'email': ["hi@test.com"], 'line_items': ["[{'sku':'testproduct1', 'quantity':'2'},{'sku':'testproduct2','quantity':'2'}]"]}
orders = pd.DataFrame(data=d)
看起来像这样:
order_id email line_items
1 hi@test.com [{'sku':'testproduct1', 'quantity':'2'},{'sku':'testproduct2','quantity':'2'}]
我希望数据框看起来像这样:
order_id email line_items.sku line_items.quantity
1 hi@test.com testproduct1 2
1 hi@test.com testproduct2 2
我使用以下代码将 line_items 的类型从字符串更改为字典:
orders.line_items = orders.line_items.apply(literal_eval)
通常我现在会使用 json_normalize
来展平 line_items 列。但我也想保留 id 并且不知道该怎么做。我也想避免任何循环。
有没有人可以帮我解决这个问题?
亲切的问候
joant95
如果你的字典真的那么奇怪,那么你可以试试:
d['line_items'] = eval(d['line_items'][0])
df = pd.json_normalize(d, record_path=['line_items'], meta=['order_id', 'email'])
要从 orders
中创建 d
,您可以尝试:
d = orders.to_dict(orient='list')
或者您可以尝试:
orders.line_items = orders.line_items.map(eval)
d = orders.to_dict(orient='records')
df = pd.json_normalize(d, record_path=['line_items'], meta=['order_id', 'email'])
但是:我还是不太清楚情况:)
这是我在 Whosebug 上的第一个问题,所以请不要烤我。 我试图在互联网上找到类似的问题,实际上有几个,但对我来说,解决方案没有用。
我创建了这个数据框:
import pandas as pd
from ast import literal_eval
d = {'order_id': [1], 'email': ["hi@test.com"], 'line_items': ["[{'sku':'testproduct1', 'quantity':'2'},{'sku':'testproduct2','quantity':'2'}]"]}
orders = pd.DataFrame(data=d)
看起来像这样:
order_id email line_items
1 hi@test.com [{'sku':'testproduct1', 'quantity':'2'},{'sku':'testproduct2','quantity':'2'}]
我希望数据框看起来像这样:
order_id email line_items.sku line_items.quantity
1 hi@test.com testproduct1 2
1 hi@test.com testproduct2 2
我使用以下代码将 line_items 的类型从字符串更改为字典:
orders.line_items = orders.line_items.apply(literal_eval)
通常我现在会使用 json_normalize
来展平 line_items 列。但我也想保留 id 并且不知道该怎么做。我也想避免任何循环。
有没有人可以帮我解决这个问题?
亲切的问候
joant95
如果你的字典真的那么奇怪,那么你可以试试:
d['line_items'] = eval(d['line_items'][0])
df = pd.json_normalize(d, record_path=['line_items'], meta=['order_id', 'email'])
要从 orders
中创建 d
,您可以尝试:
d = orders.to_dict(orient='list')
或者您可以尝试:
orders.line_items = orders.line_items.map(eval)
d = orders.to_dict(orient='records')
df = pd.json_normalize(d, record_path=['line_items'], meta=['order_id', 'email'])
但是:我还是不太清楚情况:)