我有一个包含WooCommerce订单的数据框。 在此DataFrame中,我有一个订单ID和订单项。 订单项是项目的json列表(再次列出),价格和数量:
[
{u'sku': u'100111', u'total_tax': u'1.11', u'product_id': 4089, u'price': 15.878505, u'tax_class': u'reduced-rate', u'variation_id': 6627, u'taxes': [{u'total': u'1.111495', u'subtotal': u'1.111495', u'id': 35}], u'name': u'prod2', u'meta_data': [{u'value': u'100501', u'id': 74675, u'key': u'SKU'}], u'subtotal_tax': u'1.11', u'total': u'15.88', u'subtotal': u'15.88', u'id': 9956, u'quantity': 1},
{u'sku': u'100222', u'total_tax': u'2.29', u'product_id': 4081, u'price': 32.700935, u'tax_class': u'reduced-rate', u'variation_id': 6632, u'taxes': [{u'total': u'2.289065', u'subtotal': u'2.289065', u'id': 35}], u'name': u'prod1', u'meta_data': [{u'value': u'100302', u'id': 74685, u'key': u'SKU'}], u'subtotal_tax': u'2.29', u'total': u'32.70', u'subtotal': u'32.70', u'id': 9957, u'quantity': 1}
]
我现在需要将列表中的所有项目转换为数据帧中的列,并且我还需要用这根衬线制作n行(基于列表中的列表数)。
你们有一个聪明的主意吗?
谢谢! e。
//编辑: 这是我的输入:
id, line_items
1234, [{u'sku': u'100111'}, {u'sku': u'100222'}]
我的预期输出将是
id, sku
1234, 100111
1234, 100222
答案 0 :(得分:1)
您需要将字典拼合为新的DataFrame。您可以使用以下有效的方法来做到这一点:
pd.DataFrame(
[{'id': Y, **x} for Y, X in zip(df['id'], df['line_items']) for x in X ])
id sku
0 1234 100111
1 1234 100222
这假定“ line_items”是包含字典列表的列。如果不是(如果是字符串),则可以先使用
进行转换import ast
df['line_items'] = df['line_items'].map(ast.literal_eval)
另一种替代方法是使用chain
ing:
from itertools import chain
from operator import itemgetter
pd.DataFrame({
'sku': list(
map(itemgetter('sku'), chain.from_iterable(df['line_items'].tolist()))),
'id': df['id'].values.repeat(df['line_items'].str.len())})
sku id
0 100111 1234
1 100222 1234
答案 1 :(得分:1)
pandas.io.json.json_normalize
可以自动解压缩嵌套结构。以下是您的示例代码。
from pandas.io.json import json_normalize
df = pd.DataFrame({"id": [1234], "line_items": [[{u'sku': u'100111'}, {u'sku': u'100222'}]]})
dict_df = df.to_dict(orient="records")
df = json_normalize(dict_df, record_path="line_items", meta=["id"])
输出为
sku id
0 100111 1234
1 100222 1234
您可能需要根据需要对输出的列进行重新排序。