pandas Multiindex - 带有元组列表的set_index

时间:2018-03-28 10:34:56

标签: pandas multi-index

我遇到了以下问题。我有一个现有的MultiIndex,并希望用一个元组列表替换单个级别。但我得到了一些奇怪的价值错误

重现的代码:

Office

任何人都可以评论: 1)问题是什么? 2)替换索引的最佳方法是什么(int值 - >元组值) 谢谢!

1 个答案:

答案 0 :(得分:2)

为我工作新的构造函数:

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:

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'])