Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 词典列表,以及词典中的词典_Python_Pandas - Fatal编程技术网

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