1

这是我在stackoverflow上的第一个问题,所以请不要烤我。我试图在互联网上找到类似的问题,实际上有几个,但对我来说,解决方案不起作用。

我创建了这个数据框:

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 的类型从 string 更改为 dict:

orders.line_items = orders.line_items.apply(literal_eval)

通常我json_normalize现在会用它来展平 line_items 列。但我也想保留身份证,不知道该怎么做。我也想避免任何循环。

有没有人可以帮助我解决这个问题?

亲切的问候
joant95

4

1 回答 1

1

如果您的字典真的那么奇怪,那么您可以尝试:

d['line_items'] = eval(d['line_items'][0])
df = pd.json_normalize(d, record_path=['line_items'], meta=['order_id', 'email'])

要创建dorders可以尝试:

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'])

但是:我仍然没有清楚地了解情况:)

于 2021-07-27T10:35:12.317 回答