2013-03-27 23 views
0

我有許多文件(〜2,000,000)由另一個需要從中提取數據的程序生成。這些文件共同指標對不同的方法,不同的價值,我不知道如何詞組這個舒服,所以這裏是一個三維的例子:使用大熊貓從許多文件創建大型數據庫

[x1,y1,z1,method1] 
[x1,y1,z1,method2] 
[x2,y2,z2,method1] 
[x2,y2,z2,method2] 

最後,我想有什麼是熊貓數據幀,看起來像這樣:

x y z method1 method2 ... methodn 
0 x1 y1 z1  data  data  data 
1 x2 y2 z2  data  data  data 
2 x3 y3 z3  NaN  data  data 
3 x4 y4 z4  data  NaN  data 
... 
n xn yn zn  data  NaN  NaN 

該方法會有一些漏洞,並且數據未對齊。

下面顯示的僞代碼:

file_list=glob.glob('/scratch/project/*') 

method1_list=[] 
method2_list=[] 
... 
methodn_list=[] 

#Obtain data in the correct list 
for outfile in file_list: 
    indices=(#function that obtains indices) 
    data=(#function that obtains primary data) 

    if method1: method1_list.append([indices,data]) 
    elif method2: method2_list.append([indices,data]) 
    ... 
    else methodn: methodn_list.append([indices,data]) 

#Convert list to dataframe 
method1_pd=pd.DataFrame(method1_list,columns[indices,method1]) 
method2_pd=pd.DataFrame(method2_list,columns[indices,method1]) 
... 
methodn_pd=pd.DataFrame(methodn_list,columns[indices,method1]) 

#Apply multi index 
method1=method1.set_index(indices) 
method2=method2.set_index(indices) 
... 
methodn=methodn.set_index(indices) 

#Combine data  
out=method1.combine_first(method2) 
out=out.combine_first(method3) 
... 
out=out.combine_first(methodn) 

這個作品真的很好,然而由於這些方法的數量在不斷增長,這正成爲相當繁瑣的編寫和似乎相當unpythonic。所以,我有以下問題:

  • 有沒有更好的方式來創建這樣一個數據幀? for循環之後的所有東西都已經包裝在一個定義中,但它在這裏沒有幫助可讀性。我仍然必須說明每種方法三次。
  • 如果我想更新數據集,是否有一種簡單的方法可以省略已讀取的文件?
  • 有沒有更好的方式來對齊熊貓這樣的數據?
+2

幾個問題:大約有多少方法[R有獨特的,做你知道他們的先驗,多少行總共是U期待,是U附加(如建築物,然後添加數據明天再說),結局是什麼這個框架的目標(例如查找表,計算)? – Jeff 2013-03-28 00:20:52

+0

我知道先驗的方法(總共20-30),總共會有大約200,000行,最終目標是運行統計數據,生成數據集,並提供查找表。 – Daniel 2013-03-28 12:49:43

回答

1

雖然取決於數據的實際構造方式,但這樣的東西可能會起作用。如果你能提供樣品,可能會有所幫助。它假定你的指數是已知的(或計算 你去)

from collections import defaultdict 
file_list = glob.glob('/scratch/project/*') 

methods = defaultdict([]) 
for outfile in file_list: 
    #indices = (#function that obtains indices) 
    #data = (#function that obtains primary data) 

    methods[method].append([indices,data]) 

frames = [ DataFrame(method_list,columns[indices,method]) 
     for method, method_list in methods.items() ] 

# concat 
combine_frame = pd.concat(frames,axis=1) 

# set your combined index 
result = combine_frame.set_index(indicies) 
+0

數據將不會對齊,因此一個簡單的concat將不夠用。雖然如果您以這種方式創建幀,只需簡單地通過設置索引和combine_first即可。我真的希望有一種簡單的熊貓方式來做到這一點。 – Daniel 2013-03-28 13:24:02

+0

剛剛重新建立連接之前的幀,在這種情況下 – Jeff 2013-03-28 15:01:46

1

也許CONCAT每一個文件/幀,並從最終的數據幀創建數據透視表?

df1 = pd.read_csv(StringIO("""\ 
x,y,z,data 
x1,y1,z1,1 
x2,y2,z2,1 
"""), sep=',') 
df2 = pd.read_csv(StringIO("""\ 
x,y,z,data 
x1,y1,z1,2 
x2,y2,z2,2 
"""), sep=',') 
df3 = pd.read_csv(StringIO("""\ 
x,y,z,data 
x3,y2,z2,3 
"""), sep=',') 
df1['method'] = 'method1' 
df2['method'] = 'method2' 
df3['method'] = 'method3' 
df = pd.concat([df1, df2, df3]) 

In [17]: df.pivot_table(rows=['x', 'y', 'z'], cols='method', values='data', 
...      aggfunc='first') 
Out[17]: 
method method1 method2 method3 
x y z        
x1 y1 z1  1  2  NaN 
x2 y2 z2  1  2  NaN 
x3 y2 z2  NaN  NaN  3 

In [18]: df 
Out[18]: 
    x y z data method 
0 x1 y1 z1  1 method1 
1 x2 y2 z2  1 method1 
0 x1 y1 z1  2 method2 
1 x2 y2 z2  2 method2 
0 x3 y2 z2  3 method3 
+0

啊,pivot_table +1。我最終會使用這兩個響應的混合體,但是defaultdict想法處理最緊迫的問題。 – Daniel 2013-03-28 16:01:57