这很好用:
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实际上仅限于索引,而不是列。
答案 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])