2017-07-24 154 views
1

我有一個動態填充的數據結構,所以鍵和子鍵的數量是未知的。我想將它轉換成熊貓df。該結構看起來像這樣熊貓創建從列表字典的字典的df

datastore = { 
    "user1":{ 
     "time1":[1,2,3,4], 
     "time2":[5,6,7,8], 
     "time3":[1,2,3,4] }, 
    "user2":{ 
     "time1":[1,2,3,4], 
     "time2":[5,6,7,8] } 
} 

類型的字典用字典列出了價值

我想把它轉換成熊貓DF這樣

index users times x y z k 
0  user1 time1 1 2 3 4 
1  user1 time2 5 6 7 8 
2  user1 time3 1 2 3 4 
3  user2 time1 1 2 3 4 
4  user2 time2 5 6 7 8 
.... 

我試過pd.DataFrame(字典),from_dict方法,但無法使其工作。任何幫助,將不勝感激。

編輯:很抱歉的語法錯誤,固定

+1

你的「口授詞典」在語法上是不正確的。我們會浪費我們的時間在周圍放置引號,逗號和冒號。請清理它。 – DyZ

+0

編輯語法正確,感謝您的輸入 – someRandomGuy

+0

這個問題似乎相似,可能會有所幫助https://stackoverflow.com/questions/13575090/construct-pandas-dataframe-from-items-in-nested-dictionary – Hatshepsut

回答

1

這裏有一個方法

datastore = { 
"user1":{ 
    "time1":[1,2,3,4], 
    "time2":[5,6,7,8], 
    "time3":[1,2,3,4] }, 
"user2":{ 
    "time1":[1,2,3,4], 
    "time2":[5,6,7,8]} 
} 

我們可以使用pd.DataFrame()與字典則棧()它,然後reset_index()它

df = pd.DataFrame(datastore).stack().reset_index() 
print(df) 
    level_0 level_1    0 
0 time1 user1 [1, 2, 3, 4] 
1 time1 user2 [1, 2, 3, 4] 
2 time2 user1 [5, 6, 7, 8] 
3 time2 user2 [5, 6, 7, 8] 
4 time3 user1 [1, 2, 3, 4] 

現在我們將列表中的列表分割爲0,應用pd.Series,然後將它們加入到level_1和level_2。一些列重命名,我們就大功告成了

df = df[['level_1', 'level_0']].join(df[0].apply(pd.Series)) 
df.columns = ['users', 'times', 'x', 'y', 'z', 'k'] 
print(df) 
    users times x y z k 
0 user1 time1 1 2 3 4 
1 user2 time1 1 2 3 4 
2 user1 time2 5 6 7 8 
3 user2 time2 5 6 7 8 
4 user1 time3 1 2 3 4 
+0

完美,作品就像一個魅力。非常感謝你 – someRandomGuy

+0

良好的交易,樂於幫助 –

2

選項1

pd.DataFrame.from_dict(datastore, 'index').stack() \ 
    .rename_axis(['users', 'times']) \ 
    .apply(pd.Series, index=list('xyzk')).reset_index() 

    users times x y z k 
0 user1 time1 1 2 3 4 
1 user1 time2 5 6 7 8 
2 user1 time3 1 2 3 4 
3 user2 time1 1 2 3 4 
4 user2 time2 5 6 7 8 

選項2

pd.DataFrame(
    [[u, t] + l for u, td in datastore.items() for t, l in td.items()], 
    columns='users times x y z k'.split() 
) 

    users times x y z k 
0 user1 time1 1 2 3 4 
1 user1 time2 5 6 7 8 
2 user1 time3 1 2 3 4 
3 user2 time1 1 2 3 4 
4 user2 time2 5 6 7 8 

定時

%timeit pd.DataFrame.from_dict(datastore, 'index').stack().rename_axis(['users', 'times']).apply(pd.Series, index=list('xyzk')).reset_index() 
%timeit pd.DataFrame([[u, t] + l for u, td in datastore.items() for t, l in td.items()], columns='users timets x y z k'.split()) 

100 loops, best of 3: 2.72 ms per loop 
1000 loops, best of 3: 556 µs per loop 

DEBUG
如果您複製並粘貼此代碼...它應該運行。請嘗試並報告它確實運行。

import pandas as pd 

datastore = { 
    "user1":{ 
     "time1":[1,2,3,4], 
     "time2":[5,6,7,8], 
     "time3":[1,2,3,4] }, 
    "user2":{ 
     "time1":[1,2,3,4], 
     "time2":[5,6,7,8]} 
} 

pd.DataFrame.from_dict(datastore, 'index').stack() \ 
    .rename_axis(['users', 'times']) \ 
    .apply(pd.Series, index=list('xyzk')).reset_index() 
+0

這給了我一個錯誤。 TypeError:'numpy.ndarray'對象不可調用 – someRandomGuy

+0

@someRandomGuy我已添加到我的文章中。請運行確切的代碼並告訴我它是否有效。 – piRSquared

+0

@prRSquared它確實有效,謝謝 – someRandomGuy