(編輯澄清我的應用程序,遺憾的任何混淆)熊貓數據幀+對象類型+ 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
爲什麼你不共享一些顯示數據結構的代碼?並顯示df.info() – Jeff
也許@Jeff可以提供一種方法,以您想要的方式執行此操作。但這是DataFrame的單一使用。我建議將它設置爲具有10列的DataFrame;變長列(即包含一些NaN)比變長行更容易處理。 –
謝謝丹!我結束了這樣做,並有一個單獨的「停止」列表示每個數組的實際長度(Nans意味着在我的上下文中又是一個不同的東西)。我有點無奈地發現HDF商店不支持蒙版陣列。 –