(编辑以澄清我的申请,如有任何混淆,请见谅)
我进行了一个分成试验的实验。每次试验都可能产生无效数据或有效数据。当存在有效数据时,数据采用长度为零的数字列表的形式。
所以一个无效的试验产生None
,一个有效的试验可以产生[]
等等[1,2]
。
理想情况下,我希望能够将此数据保存为frame_table
(调用它data
)。我有另一个表(称为它trials
),它很容易转换为 aframe_table
并用作 aselector
来提取行(试验)。然后我想使用select_as_multiple
.
现在,data
当我使用object
数组时,我将结构保存为常规表。我意识到人们说这是低效的,但我想不出一种有效的方法来处理data
.
我知道我可以使用 NaN 并制作一个(可能非常宽)表,其最大宽度是我的数据数组的最大长度,但是我需要一种不同的机制来标记无效试验。包含所有 NaN 的行令人困惑——这是否意味着我进行了零长度数据试验,或者我进行了无效试验?
我认为使用 Pandas 没有很好的解决方案。NaN 解决方案将我引导到可能非常宽的表和一个标记有效/无效试验的附加列
如果我使用数据库,我会创建data
一个二进制 blob 列。使用 Pandas,我目前的工作解决方案是在常规框架中保存data
为object
数组并将其全部加载,然后根据我的trials
表提取相关索引。
这有点低效,因为我一口气读完了整张data
桌子,但这是我想出的最可行/可扩展的方案。
但我最热情地欢迎更规范的解决方案。
非常感谢您的所有时间!
编辑:添加代码(杰夫的建议)
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