2014-01-02 2 views
2

Это прекрасно работает:Панды HDFStore таблицы не принимает мультииндексных столбцы

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 сообщает, что мультииндекс фактически ограничен индексом, а не столбцами.

ответ

3

Это не поддерживается, например. Оба столбца - мультииндекс и индексный индекс. Либо один работает. Однако, как правило, многоиндекс столбца не очень полезен, поскольку его невозможно выбрать из него с каким-то действительно странным синтаксисом (столбцы хранятся в виде кортежей, поэтому они должны быть выбраны явно). Поэтому я бы не рекомендовал его в любом случае.

Я открою вопрос поддержки и, так как она в настоящее время подъемов, в любом случае, смотрите здесь: https://github.com/pydata/pandas/issues/5823

+0

На самом деле не так сложно выделить многоколонные слова, например: '' idx = pd.IndexSlice; df.loc [:, idx [:, 'mean']] '' то, что я делаю все время. – ankostis

+0

@ankostis это из хранилища на диске, которое сериализует имена столбцов в виде строк и НЕ в рамке памяти – Jeff

1

Пока #5823 не будет решена, вы можете свернуть индекс перед сохранением, как обходной путь (увидеть это ТАК, как: 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]) 
Смежные вопросы