2013-08-29 40 views
0

(編輯澄清我的應用程序,遺憾的任何混淆)熊貓數據幀+對象類型+ HDF + PyTables「表」

我運行分成試驗的實驗。每個試驗都可能產生無效數據或有效數據。當存在有效數據時,數據採用長度爲零的數字列表的形式。

所以無效試製None和有效的試用可以產生[][1,2]等等等等

理想情況下,我希望能夠將這些數據保存爲frame_table(稱之爲data)。我有另一個表(稱爲trials),它很容易轉換爲frame_table,我用它作爲selector來提取行(試驗)。然後我想通過使用select_as_multiple的數據拉起。

現在,我正在將data結構保存爲常規表格,因爲我使用的是object陣列。我意識到人們說這是低效的,但我想不出一種有效的方式來處理data的可變長度性質。

我明白,我可以使用NaN和使(潛在的非常寬)表,其最大寬度是我的數據陣列的最大長度,但然後我需要不同的機制來標誌無效的審判。所有NaN行都很混亂 - 這是否意味着我進行了零長度數據試驗或是否有無效試驗?

我認爲沒有很好的解決方案來使用熊貓。 NaN解決方案將我引向潛在的非常寬泛的表格和額外的列標記有效/無效試驗

如果我使用了數據庫,我將使data成爲二進制BLOB列。對於Pandas,我目前的工作解決方案是將data作爲object數組以常規框架的形式保存,並將其全部加載,然後根據我的trials表提取相關索引。

這個效率稍低,因爲我一次只讀完整個data表,但這是我提出的最可行/可擴展的方案。

但我最熱烈地歡迎更加規範的解決方案。

非常感謝您的時間!

編輯:添加代碼(Jeff的建議)

import pandas as pd, numpy 
mydata = [numpy.empty(n) for n in range(1,11)] 

df = pd.DataFrame(mydata) 

In [4]: df 
Out[4]: 
                0 
0        [1.28822975392e-231] 
1   [1.28822975392e-231, -2.31584192385e+77] 
2 [1.28822975392e-231, -1.49166823584e-154, 2.12... 
3 [1.28822975392e-231, 1.2882298313e-231, 2.1259... 
4 [1.28822975392e-231, 1.72723381477e-77, 2.1259... 
5 [1.28822975392e-231, 1.49166823584e-154, 1.531... 
6 [1.28822975392e-231, -2.68156174706e+154, 2.20... 
7 [1.28822975392e-231, -2.68156174706e+154, 2.13... 
8 [1.28822975392e-231, -1.3365130604e-315, 2.222... 
9 [1.28822975392e-231, -1.33651054067e-315, 2.22... 

In [5]: df.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 10 entries, 0 to 9 
Data columns (total 1 columns): 
0 10 non-null values 
dtypes: object(1) 

df.to_hdf('test.h5','data') 
--> OK 

df.to_hdf('test.h5','data1',table=True) 
--> ... 
TypeError: Cannot serialize the column [0] because 
its data contents are [mixed] object dtype 
+0

爲什麼你不共享一些顯示數據結構的代碼?並顯示df.info() – Jeff

+1

也許@Jeff可以提供一種方法,以您想要的方式執行此操作。但這是DataFrame的單一使用。我建議將它設置爲具有10列的DataFrame;變長列(即包含一些NaN)比變長行更容易處理。 –

+0

謝謝丹!我結束了這樣做,並有一個單獨的「停止」列表示每個數組的實際長度(Nans意味着在我的上下文中又是一個不同的東西)。我有點無奈地發現HDF商店不支持蒙版陣列。 –

回答

1

這裏是沿着你所描述

In [17]: df = DataFrame(randn(10,10)) 

In [18]: df.iloc[5:10,7:9] = np.nan 

In [19]: df.iloc[7:10,4:9] = np.nan 

In [22]: df.iloc[7:10,-1] = np.nan 

In [23]: df 
Out[23]: 
      0   1   2   3   4   5   6   7   8   9 
0 -1.671523 0.277972 -1.217315 -1.390472 0.944464 -0.699266 0.348579 0.635009 -0.330561 -0.121996 
1 0.239482 -0.050869 0.488322 -0.668864 0.125534 -0.159154 1.092619 -0.638932 -0.091755 0.291824 
2 0.432216 -1.101879 2.082755 -0.500450 0.750278 -1.960032 -0.688064 -0.674892 3.225115 1.035806 
3 0.775353 -1.320165 -0.180931 0.342537 2.009530 0.913223 0.581071 -1.111551 1.118720 -0.081520 
4 -0.255524 0.143255 -0.230755 -0.306252 0.748510 0.367886 -1.032118 0.232410 1.415674 -0.420789 
5 -0.850601 0.273439 -0.272923 -1.248670 0.041129 0.506832 0.878972  NaN  NaN 0.433333 
6 -0.353375 -2.400167 -1.890439 -0.325065 -1.197721 -0.775417 0.504146  NaN  NaN -0.635012 
7 -0.241512 0.159100 0.223019 -0.750034  NaN  NaN  NaN  NaN  NaN  NaN 
8 -1.511968 -0.391903 0.257445 -1.642250  NaN  NaN  NaN  NaN  NaN  NaN 
9 -0.376762 0.977394 0.760578 0.964489  NaN  NaN  NaN  NaN  NaN  NaN 

In [24]: df['stop'] = df.apply(lambda x: x.last_valid_index(), 1) 

In [25]: df 
Out[25]: 
      0   1   2   3   4   5   6   7   8   9 stop 
0 -1.671523 0.277972 -1.217315 -1.390472 0.944464 -0.699266 0.348579 0.635009 -0.330561 -0.121996  9 
1 0.239482 -0.050869 0.488322 -0.668864 0.125534 -0.159154 1.092619 -0.638932 -0.091755 0.291824  9 
2 0.432216 -1.101879 2.082755 -0.500450 0.750278 -1.960032 -0.688064 -0.674892 3.225115 1.035806  9 
3 0.775353 -1.320165 -0.180931 0.342537 2.009530 0.913223 0.581071 -1.111551 1.118720 -0.081520  9 
4 -0.255524 0.143255 -0.230755 -0.306252 0.748510 0.367886 -1.032118 0.232410 1.415674 -0.420789  9 
5 -0.850601 0.273439 -0.272923 -1.248670 0.041129 0.506832 0.878972  NaN  NaN 0.433333  9 
6 -0.353375 -2.400167 -1.890439 -0.325065 -1.197721 -0.775417 0.504146  NaN  NaN -0.635012  9 
7 -0.241512 0.159100 0.223019 -0.750034  NaN  NaN  NaN  NaN  NaN  NaN  3 
8 -1.511968 -0.391903 0.257445 -1.642250  NaN  NaN  NaN  NaN  NaN  NaN  3 
9 -0.376762 0.977394 0.760578 0.964489  NaN  NaN  NaN  NaN  NaN  NaN  3 

注意什麼線一個簡單的例子,在0.12,你應該使用table=True,而不是fmt (這是在改變的過程中)

In [26]: df.to_hdf('test.h5','df',mode='w',fmt='t') 

In [27]: pd.read_hdf('test.h5','df') 
Out[27]: 
      0   1   2   3   4   5   6   7   8   9 stop 
0 -1.671523 0.277972 -1.217315 -1.390472 0.944464 -0.699266 0.348579 0.635009 -0.330561 -0.121996  9 
1 0.239482 -0.050869 0.488322 -0.668864 0.125534 -0.159154 1.092619 -0.638932 -0.091755 0.291824  9 
2 0.432216 -1.101879 2.082755 -0.500450 0.750278 -1.960032 -0.688064 -0.674892 3.225115 1.035806  9 
3 0.775353 -1.320165 -0.180931 0.342537 2.009530 0.913223 0.581071 -1.111551 1.118720 -0.081520  9 
4 -0.255524 0.143255 -0.230755 -0.306252 0.748510 0.367886 -1.032118 0.232410 1.415674 -0.420789  9 
5 -0.850601 0.273439 -0.272923 -1.248670 0.041129 0.506832 0.878972  NaN  NaN 0.433333  9 
6 -0.353375 -2.400167 -1.890439 -0.325065 -1.197721 -0.775417 0.504146  NaN  NaN -0.635012  9 
7 -0.241512 0.159100 0.223019 -0.750034  NaN  NaN  NaN  NaN  NaN  NaN  3 
8 -1.511968 -0.391903 0.257445 -1.642250  NaN  NaN  NaN  NaN  NaN  NaN  3 
9 -0.376762 0.977394 0.760578 0.964489  NaN  NaN  NaN  NaN  NaN  NaN  3 
+0

感謝您的答案@Jeff,但保存的frame_table將值視爲NaN。也許我濫用蒙面數組框架,但在我的應用程序中,我既缺少數據也缺少空數據。所以我的行可能會丟失(NaN)或具有可變數量的數據點(包括零)。這就是爲什麼一個簡單的NaN不適合我。 –

+0

它的簡單性足以讓另一列跟蹤數據集的最大長度。否則你應該將這些東西分開存儲,因爲它們真的是分開的。熊貓在軸上對齊,如果你不使用它,那麼你應該保持你的數據的其他方式。 – Jeff