Pandas HDFStore Tables不接受多索引列

时间:2014-01-02 17:24:06

标签: python pandas pytables

这很好用:

cols = ['X', 'Y']
ind = [('A', 1), ('B', 2)]
ind = pd.MultiIndex.from_tuples(index, names=['foo', 'number'])

df = pd.DataFrame(rand(2,2), columns = cols, index=ind)
store.put('df', df, table=True)
print store['df']

               X         Y
foo number                    
A   1       0.015005  0.213427
B   2       0.090311  0.595418

这打破了:

cols = [('X', 1), ('Y', 2)]
cols = pd.MultiIndex.from_tuples(index, names=['bar', 'number'])
ind = [('A', 1), ('B', 2)]
ind = pd.MultiIndex.from_tuples(index, names=['foo', 'number'])

df = pd.DataFrame(rand(2,2), columns = cols, index=ind)
store.put('df', df, table=True)
print store['df']

KeyError: u'no item named foo'

我怀疑这是使用PyTables的一个已知限制,但我在Pandas文档中找不到任何参考,因为multiindex实际上仅限于索引,而不是列。

2 个答案:

答案 0 :(得分:3)

不支持,例如既有列多索引又有索引多索引。任何一个人都可以工作。但是,一般来说,列多索引不是很有用,因为它不可能从中选择一些非常奇怪的语法(列存储为元组,因此必须明确选择它们)。所以我不会在任何情况下推荐它。

我会打开一个问题来支持这两个问题,因为无论如何,无论如何,请看这里:https://github.com/pydata/pandas/issues/5823

答案 1 :(得分:1)

#5823解决之前,您可以在存储索引之前折叠索引,作为解决方法(请参阅此SO how:https://stackoverflow.com/a/14508355/548792):

assert isinstance(df.columns, pd.MultiIndex), df
df.columns = ['.'.join(col).strip() for col in df.columns.values]
df.to_hdf(store, 'df', table=True)

要重新创建它,假设原始列名称中的任何位置都不存在其他点(.):

df = store['/df']
df.columns = pd.MultiIndex.from_tuples([c.split('.') for c in df.columns])