pandas Multiindex-使用元组列表设置索引

pandas Multiindex-使用元组列表设置索引,pandas,multi-index,Pandas,Multi Index,我经历了以下问题。我有一个现有的多索引,希望用元组列表替换单个级别。但我得到了一些奇怪的值错误 要复制的代码: idx = pd.MultiIndex.from_tuples([(1, u'one'), (1, u'two'), (2, u'one'), (2, u'two')], names=['foo', 'bar']) idx.set_levels([3

我经历了以下问题。我有一个现有的多索引,希望用元组列表替换单个级别。但我得到了一些奇怪的值错误

要复制的代码:

idx = pd.MultiIndex.from_tuples([(1, u'one'), (1, u'two'),
                                  (2, u'one'), (2, u'two')],
                                  names=['foo', 'bar'])

idx.set_levels([3, 5], level=0) # works fine
idx.set_levels([(1,2),(3,4)], level=0) #TypeError: Levels must be list-like
谁能评论一下: 1) 有什么问题吗? 2) 替换索引(int值->元组值)的最佳方法是什么
谢谢

对于我在新承包商工作:

idx = pd.MultiIndex.from_product([[(1,2),(3,4)], idx.levels[1]], names=idx.names)
print (idx)
MultiIndex(levels=[[(1, 2), (3, 4)], ['one', 'two']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['foo', 'bar'])
EIT1:

编辑:


我想这就是OP想要的!这对我不起作用。我想替换现有表的多索引级别。但该表并不是两个索引级别的完全笛卡尔积。行数较低。@KarelMarik-我添加了新值,我认为它应该工作得很好。EDIT1与df.rename的变通方法对我很有效。不知为什么df.index.set_levels([(1,2),(3,4)],level=0)不起作用(bug?@KarelMarik-我想是bug还是还没有实现。如果我的答案有用,别忘了。谢谢
df = pd.DataFrame({'A':list('abcdef'),
                   'B':[1,2,1,2,2,1],
                   'C':[7,8,9,4,2,3],
                   'D':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,4],
                   'F':list('aaabbb')}).set_index(['B','C'])


#dynamic generate dictioanry with list of tuples
new = [(1, 2), (3, 4)]
d = dict(zip(df.index.levels[0], new))
print (d)
{1: (1, 2), 2: (3, 4)}

#explicit define dictionary 
d = {1:(1,2), 2:(3,4)}

#rename first level of MultiInex
df = df.rename(index=d, level=0)
print (df)
          A  D  E  F
B      C            
(1, 2) 7  a  1  5  a
(3, 4) 8  b  3  3  a
(1, 2) 9  c  5  6  a
(3, 4) 4  d  7  9  b
       2  e  1  2  b
(1, 2) 3  f  0  4  b
new = [(1, 2), (3, 4)]
lvl0 = list(map(tuple, np.array(new)[pd.factorize(idx.get_level_values(0))[0]].tolist()))
print (lvl0)
[(1, 2), (1, 2), (3, 4), (3, 4)]

idx = pd.MultiIndex.from_arrays([lvl0, idx.get_level_values(1)], names=idx.names)
print (idx)
MultiIndex(levels=[[(1, 2), (3, 4)], ['one', 'two']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['foo', 'bar'])