规范化json列并与 Dataframe 的其余部分连接

xpszyzbs  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(508)

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

  1. import pandas as pd
  2. from ast import literal_eval
  3. d = {'order_id': [1], 'email': ["hi@test.com"], 'line_items': ["[{'sku':'testproduct1', 'quantity':'2'},{'sku':'testproduct2','quantity':'2'}]"]}
  4. orders = pd.DataFrame(data=d)

看起来是这样的:

  1. order_id email line_items
  2. 1 hi@test.com [{'sku':'testproduct1', 'quantity':'2'},{'sku':'testproduct2','quantity':'2'}]

我希望 Dataframe 如下所示:

  1. order_id email line_items.sku line_items.quantity
  2. 1 hi@test.com testproduct1 2
  3. 1 hi@test.com testproduct2 2

我使用以下代码将行_项的类型从string更改为dict:

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

通常我会使用 json_normalize 现在要展平line_items列。但我也想保留身份证,不知道怎么做。我还想避免任何循环。
有人能帮我解决这个问题吗?
问候
乔安娜95

hgncfbus

hgncfbus1#

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

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

创造 d 从…里面 orders 你可以试试:

  1. d = orders.to_dict(orient='list')

或者你可以试试:

  1. orders.line_items = orders.line_items.map(eval)
  2. d = orders.to_dict(orient='records')
  3. df = pd.json_normalize(d, record_path=['line_items'], meta=['order_id', 'email'])

但是:我仍然不清楚情况:)

相关问题