2017-03-18 60 views
4

我有一個字典,每個鍵都包含一個浮點值列表。這些列表的大小不一樣。列表到數據框的字典

我想將此字典轉換爲數據框,以便我可以輕鬆地對數據執行一些分析功能(最小值,最大值,平均值,標準偏差,更多)。

我的字典裏是這樣的:

{ 
    'key1': [10, 100.1, 0.98, 1.2], 
    'key2', [72.5], 
    'key3', [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7] 
} 

什麼是進入一個數據幀,這樣我可以利用basic functionssummeandescribestd的最佳方式?

我發現的例子(如上面的鏈接)都假設列表中的每個鍵都具有相同數量的值。

+0

輸出結果應該如何?具有可變列高度的DataFrame的概念沒有任何意義,因爲行沒有對齊。幾乎肯定有更好的方法來做你正在嘗試的。例如創建單獨的系列。 – Denziloe

+0

簡短的回答是:你不能。如果你想要統計功能,你總是可以使用numpy。 – James

回答

11
d={ 
    'key1': [10, 100.1, 0.98, 1.2], 
    'key2': [72.5], 
    'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7] 
} 

df=pd.DataFrame.from_dict(d,orient='index').transpose() 

然後df

key3 key2 key1 
0 1.00 72.5 10.00 
1 5.20 NaN  100.10 
2 71.20 NaN  0.98 
3 9.00 NaN  1.20 
4 10.11 NaN  NaN 

請注意,numpy有一些內置函數,可以進行計算,忽略NaN值,這在這裏可能有關。例如,如果你想找到'key1'列的意思,你可以如下做到這一點:

import numpy as np 
np.nanmean(df[['key1']]) 
28.07 

其他有用的功能包括:numpy.nanstd, numpy.nanvar, numpy.nanmedian, numpy.nansum

編輯:請注意,從您的basic functions鏈接功能也可以處理nan值。但是,它們的估計量可能與numpy的不同。例如,他們計算unbiased estimator of sample variance,而numpy版本計算"usual" estimator of sample variance

3

我建議你剛剛創建系列的一個字典,因爲你的鑰匙沒有相同數量的值:

{ key: pd.Series(val) for key, val in x.items() } 

然後,您可以在每列做大熊貓單獨操作。

一旦你的,如果你真的想要一個數據框,您可以:

pd.DataFrame({ key: pd.Series(val) for key, val in x.items() }) 

    key1 key2 key3 
0 10.00 72.5 1.00 
1 100.10 NaN 5.20 
2 0.98 NaN 71.20 
3 1.20 NaN 9.00 
4  NaN NaN 10.11 
5  NaN NaN 12.21 
6  NaN NaN 65.00 
7  NaN NaN 7.00 
1
your_dict = { 
    'key1': [10, 100.1, 0.98, 1.2], 
    'key2': [72.5], 
    'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7] 
} 

pd.concat({k: pd.Series(v) for k, v in your_dict.items()}) 

key1 0  10.00 
     1 100.10 
     2  0.98 
     3  1.20 
key2 0  72.50 
key3 0  1.00 
     1  5.20 
     2  71.20 
     3  9.00 
     4  10.11 
     5  12.21 
     6  65.00 
     7  7.00 
dtype: float64 

或用axis=1

your_dict = { 
    'key1': [10, 100.1, 0.98, 1.2], 
    'key2': [72.5], 
    'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7] 
} 

pd.concat({k: pd.Series(v) for k, v in your_dict.items()}, axis=1) 

    key1 key2 key3 
0 10.00 72.5 1.00 
1 100.10 NaN 5.20 
2 0.98 NaN 71.20 
3 1.20 NaN 9.00 
4  NaN NaN 10.11 
5  NaN NaN 12.21 
6  NaN NaN 65.00 
7  NaN NaN 7.00