假设我有一个块稀疏的DataFrame。通过这个,我的意思是有一组行具有不相交的非空列集合。存储这个巨大的表格会在值中使用更多的内存(nan填充),并且将表格拆分为行将创建大型索引(至少在保存到磁盘时似乎是这样的......如果存在,我不是100%清除是应该进行的一些有效的MultiIndexing)。python pandas native select_as_multiple
通常,我将块存储为字典或列表中的单独DataFrame(删除nan列)并创建一个与DataFrame具有几乎相同api的类,'手动'将查询传递给块并连接结果。这很好,但涉及少量的特殊代码来存储和处理这些对象。
最近,我注意到pytables提供了一个类似于这个功能的功能,但仅限于pytables查询api。
有没有办法在熊猫本身处理这种方式?或者我错过了一些获得性能类似的解决方案的简单方法?
编辑:这里是一个小例子集
import pandas, string, itertools
from pylab import *
# create some data and put it in a list of blocks (d)
m = 10; n = 6;
s = list(string.ascii_uppercase)
A = array([s[x] * (1 + mod(x, 3)) for x in randint(0, 26, m*n)]).reshape(m, n)
df = pandas.DataFrame(A)
d = list()
d += [df.ix[0:(m/2)].T.ix[0:(n/2)].T]
d += [df.ix[(m/2):].T.ix[(n/2):].T]
# 1. use lots of memory, fill with na
d0 = pandas.concat(d) # this is just the original df
# 2. maybe ok, not sure how this is handled across different pandas versions
d1 = pandas.concat([x.unstack() for x in d])
# want this to work however the blocks are stored
print(d0.ix[[0, 8]][[2,5]])
# this raises exception
sdf = pandas.SparseDataFrame(df)
你可以发布一些示例数据来展示你正在处理的结构类型吗?另外,如果你看过'pandas.SparseDataFrame',你能解释为什么这对你的情况不起作用吗? – Marius
@Marius:谢谢,我并没有真正意识到SparseDataFrame。有一个简短的审视和简短的尝试,它似乎只处理浮动(至少默认情况下)。我想到的用例涉及混合类型,如果我做了一些工作,我可能会逐列执行更严格的输入。在0.13中 – mathtick
,稀疏将支持多种dtypes,这样可能适合你。 – Jeff