簡體   English   中英

列表字典中的數據框

[英]dataframe from dictionary of lists

有沒有一種方法可以完全遵循pandas方法進行操作,或者實際上首先重新安排字典本身是否更合理?

初始字典:

data_json = {'a':[{'aa':1,'bb':2,'cc':3},
                  {'aa':2,'bb':2,'cc':3},
                  {'aa':3,'bb':2,'cc':3}],
             'b':[{'beta':22,'alpha':23,'gamma':24},
                  {'gamma':24,'beta':25,'alpha':26},
                  {'alpha':34,'beta':35,'gamma':36}]}

我想獲得一個數據框,其中列名將嵌套字典鍵:

  aa bb cc alpha beta gamma
1  1  2  3    23   22    24
2  2  2  3    26   25    24
3  3  2  3    34   35    36

試:

aaa = pd.DataFrame(data_json)
foo = lambda x: pd.Series([i for i in x.items()])
bbb=pd.concat([aaa['a'].apply(foo),aaa['b'].apply(foo)],axis=1)

給我

   0  1  2     0    1     2
1  1  2  3    23   22    24
2  2  2  3    26   25    24
3  3  2  3    34   35    36

但是現在我卡住了,因為列名重復[0,1,2,0,1,2],我不能只使用

bbb.rename(columns={0:'a',1:'b',...})

正如我說的,我不介意重新排序初始詞典,但我希望整個過程盡可能整潔。

我將分別加載'a'和'b'並加入它們(將它們合並到索引上):

pd.DataFrame(data_json['a']).join(pd.DataFrame(data_json['b']))


   aa  bb  cc  alpha  beta  gamma
0   1   2   3     23    22     24
1   2   2   3     26    25     24
2   3   2   3     34    35     36

如果您不知道有多少data_json.keys() ,則使用循環的另一種方法,然后使用pd.concat因為使用列表更方便。 請注意,我使用的sorted(data_json)這樣我就可以得到ab

list_df = []
for k in sorted(data_json):
    list_df.append(pd.DataFrame(data_json[k]))
pd.concat(list_df, axis=1)

我會用concat 注意:

In [11]: pd.DataFrame(data_json['a'])
Out[11]: 
   aa  bb  cc
0   1   2   3
1   2   2   3
2   3   2   3

In [12]: pd.DataFrame(data_json['b'])
Out[12]: 
   alpha  beta  gamma
0     23    22     24
1     26    25     24
2     34    35     36

如此簡單:

In [13]: pd.concat((pd.DataFrame(v) for v in data_json.values()), axis=1)
Out[13]: 
   alpha  beta  gamma  aa  bb  cc
0     23    22     24   1   2   3
1     26    25     24   2   2   3
2     34    35     36   3   2   3

In [14]: 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM