Python 词典列表,以及词典中的词典
我想从字典列表中创建一个干净的数据帧,其中字典中键的值也可以是字典列表 以下是我的初步清单:Python 词典列表,以及词典中的词典,python,pandas,Python,Pandas,我想从字典列表中创建一个干净的数据帧,其中字典中键的值也可以是字典列表 以下是我的初步清单: [ {'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}]}] 最初,我将列表转换为数据帧 lis
[ {'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)
虽然这会将我的列表转换为一个数据框架,但有两列称为“类别”和“买家”,它们仍然是一个字典列表。我不知道如何将这些列转换为列,其中key name是列名,value在行中。我的最终结果如下:
____product_id____toy_id____sales____buyer_id____buyer_age
________1_________x1_______50_______y1__________22____
________1_________x2_______50_______y2__________31____
以下是我尝试过的代码(我正试图再次将以前的代码转换为数据帧,我想它可能会破坏字典):
有人能帮忙吗?一旦你像以前那样创建了
列表\u pd
,你就可以在列类别和买家上使用,然后从每个分解列创建一个数据框,保留原始索引,包括数据框和列“product\u 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
一旦您像以前一样创建了
list_pd
,您就可以在两列categories和buyer上使用,然后从每个分解列创建一个数据框,保留原始索引、两个数据框和列“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
您可以使用pandas功能:获取两个数据帧(类别和买家)并与pandas合并:
您可以使用pandas功能:获取两个数据帧(类别和买家)并与pandas合并:
@HamzaKhalid如果不希望索引中有重复的值,您可能希望在末尾使用
reset\u index(drop=True)
)谢谢你,本。另一个小小的补充:我的一个专栏不是词典列表,而是词典。我不能在此使用explode方法(因为explode需要一个列表)。你知道我如何把字典改成单独的列,以键作为标题吗?@HamzaKhalid我想你可以做pd.DataFrame(list\u pd['col\u name'].tolist(),index=list\u pd.index)
?我想诀窍应该是在让熊猫加入之前(在制作list\u pd时)先把字典转换成列,像这样,如果没有确切的结构,很难说,因为有很多可能性;)也许可以问一个新的问题question@HamzaKhalid如果不想在索引中有重复的值,您也可以在末尾使用reset\u index(drop=True)
)谢谢你,本。另一个小小的补充:我的一个专栏不是词典列表,而是词典。我不能在此使用explode方法(因为explode需要一个列表)。你知道我如何把字典改成单独的列,以键作为标题吗?@HamzaKhalid我想你可以做pd.DataFrame(list\u pd['col\u name'].tolist(),index=list\u pd.index)
?我想诀窍应该是在让熊猫加入之前(在制作list\u pd时)先把字典转换成列,像这样,如果没有确切的结构,很难说,因为有很多可能性;)也许会问一个新问题
from pandas import json_normalize
categories = json_normalize(data,'categories','product_id')
buyers = json_normalize(data,'buyers')
pd.concat((categories,buyers),axis=1)
toy_id sales product_id buyer_id buyer_age
0 x1 50 1 y1 22
1 x2 50 1 y2 31