2017-05-30 58 views
0

我的目標是初始化一個空的數據框並逐行填充它。起初我不知道行標籤是什麼(index),也不知道columns是什麼。另外,index可以是多層次的。初始化一個空的DataFrame以進行動態分配

這是我正在努力完成的一個例子。

首選方法

import pandas as pd 
import numpy as np 

# Demo data which will be used to populate the dataframe 
my_list = [pd.Series(np.random.rand(10), index=np.arange(10)*1e-6) for i in range(5)] 

# Demo indices which will be used to index the dataframe 
id1 = ['a', 'b', 'c', 'd', 'e'] 
id2 = [0.1, 0.2, 0.3, 0.4, 0.5] 
id3 = [0, 1, 2, 3, 4] 

df = pd.DataFrame() 
for i1, i2, i3, s in zip(id1, id2, id3, my_list): 
    df.loc[(i1, i2, i3), :] = s 

而且當然啦,這是不正確的,並拋出我的錯誤:

KeyError: "['a' 0.1 0] not in index" 

當前的方法

目前,我解決這個問題的方法問題是我知道所有行的列標籤都是一樣的,所以一旦我回來了在第一輯中,我知道所有系列的標籤。另外,我知道索引是三個級別。因此,這裏是我做的:

df = None 
idx = pd.MultiIndex(labels=[[], [], []], levels=[[], [], []], names=['id1', 'id2', 'id3']) 

for i1, i2, i3, s in zip(id1, id2, id3, my_list): 
    if df is None: 
     df = pd.DataFrame(index=idx, columns=s.index) 
    df.loc[(i1, i2, i3)] = s 

問題

什麼是接近最好的方法?是否有可能刪除循環中的if語句和當前方法中的空索引聲明,以便它將沿着首選方法的行?

回答

1

我覺得更好,更快的是使用DataFrame構造與my_listMultiIndex.from_arrays,因爲loopspandas很慢,最好是避免它:

mux = pd.MultiIndex.from_arrays([id1, id2, id3], names=['id1', 'id2', 'id3']) 
df = pd.DataFrame(my_list, index=mux) 
print (df) 
      0.000000 0.000001 0.000002 0.000003 0.000004 0.000005 \ 
id1 id2 id3                
a 0.1 0 0.804894 0.121733 0.030610 0.084308 0.751264 0.542138 
b 0.2 1 0.868729 0.049293 0.679061 0.375005 0.281873 0.182111 
c 0.3 2 0.766086 0.779906 0.928323 0.724433 0.275672 0.279673 
d 0.4 3 0.656994 0.304625 0.430252 0.350452 0.558119 0.674358 
e 0.5 4 0.045430 0.371147 0.885556 0.318458 0.411363 0.419160 

      0.000006 0.000007 0.000008 0.000009 
id1 id2 id3           
a 0.1 0 0.941973 0.318702 0.060750 0.108110 
b 0.2 1 0.944578 0.839771 0.331519 0.973904 
c 0.3 2 0.373569 0.985934 0.855927 0.878398 
d 0.4 3 0.041317 0.900308 0.728050 0.897996 
e 0.5 4 0.312687 0.662131 0.034483 0.633083 
+0

感謝您的回答。就像後續一樣,我想我應該在我的問題中指出,對於我的實際數據,我必須有一個循環才能瀏覽系列,因爲我正在從文件中讀取它們(每個系列都從HDF表的條目中讀取)。我用my_list只是一個演示... –

+0

然後更好的是將數據從循環附加到列表並最後通過'concat'創建'DataFrame' - 也許可以幫助[this](https://stackoverflow.com/a/39850990/2901002) )回答。 – jezrael