我想从词典列表中创建一个干净的熊猫数据框,其中字典中键的值也可以是词典列表。
这是我的初始列表:
[ {'product_id':1,
'categories': [{'toy_id':'x1', 'sales':50}, {'toy_id':'x2', 'sales':50}],
'buyers': [{'buyer_id':'y1' , 'buyer_age':22}, {'buyer_id':'y2' ,'buyer_age':31}]}]
最初,我将列表转换为熊猫数据框
list_pd = pd.DataFrame(list)
尽管这会将我的列表转换为pandas数据框,但是有两列称为“类别”和“购买者”,它们仍然是词典列表。我不确定如何将这些列转换为键名是列名而值在行中的列。我的最终结果将如下所示:
____product_id____toy_id____sales____buyer_id____buyer_age
________1_________x1_______50_______y1__________22____
________1_________x2_______50_______y2__________31____
这是我尝试过的代码(我试图将我以前的代码再次转换为数据帧,以为可能会破坏字典):
list_pd_2 = pd.DataFrame(list_pd)
有人可以帮忙吗?
答案 0 :(得分:3)
一旦像您一样创建了list_pd
,就可以在列类别和买方上同时使用explode
,然后从每个展开的列中创建一个数据框,同时保留原始索引concat
数据帧和join
到“ product_id”列,例如:
s_cat = list_pd['categories'].explode()
s_buy = list_pd['buyers'].explode()
df_f = list_pd[['product_id']]\
.join(pd.concat([pd.DataFrame(s_cat.tolist(), index=s_cat.index),
pd.DataFrame(s_buy.tolist(), index=s_buy.index)],
axis=1))
print (df_f)
product_id toy_id sales buyer_id buyer_age
0 1 x1 50 y1 22
0 1 x2 50 y2 31
答案 1 :(得分:1)
您可以利用熊猫json_normalize函数:获取两个数据框(类别和购买者)并与熊猫concat合并回去:
$signatureImage = file_get_contents('signatures/' . $id . '_SIGNATURE.png');
$lob = oci_new_descriptor($conn, OCI_D_LOB);
$signatureSql = oci_parse($conn, "UPDATE DT_WEB SET DT_SIGNATURE = EMPTY_BLOB() WHERE DT_ID = '$id' RETURNING DT_SIGNATURE INTO :SIGNATUREIMG");
oci_bind_by_name($signatureSql, ':SIGNATUREIMG', $lob, -1, OCI_B_BLOB);
oci_execute($signatureSql, OCI_DEFAULT);
$lob->saveFile($signatureImage);
$lob->free();
oci_free_statement($signatureSql);