Pandas适用于具有mult-iindex的数据帧索引

时间:2018-06-13 05:12:01

标签: pandas

我的数据框的索引类似于

MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F', 'G'], [0, 1]],
       labels=[[0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6], [0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]],
       names=['I1', 'I2'])

现在我想应用一个函数来索引I1。 如果它是一个简单的列,我会做类似的事情

df['I1'] = df['I1'].apply(lamdba x :...)

如何将此应用于具有多索引的df中的索引?

1 个答案:

答案 0 :(得分:1)

我认为需要rename

df = df.rename(lambda x: 'a' + x, level=0)

Index.get_level_values选择级MultiIndexmap,然后创建MultiIndex.from_arrays

idx = df.index.get_level_values('I1').map(lambda x: 'a' + x)

df.index = pd.MultiIndex.from_arrays([idx, df.index.get_level_values('I2')])

因为我得到了:

df.index = df.index.set_levels(idx, level='I1')
  

ValueError:级别值必须是唯一的:['aA','aA','aB','aB','aC','aD','aD','aE','aE','aF ','aF','aG','aG']在0级

<强>示例

mux = pd.MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F', 'G'], [0, 1]],
       labels=[[0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6], [0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]],
       names=['I1', 'I2'])

df = pd.DataFrame([0] * 13, index=mux, columns=['a'])
df = df.rename(lambda x: 'a' + x, level=0)
print(df)
       a
I1 I2   
aA 0   0
   1   0
aB 0   0
   1   0
aC 1   0
aD 0   0
   1   0
aE 0   0
   1   0
aF 0   0
   1   0
aG 0   0
   1   0