首页 > 解决方案 > Pandas 应用于具有多 iindex 的数据帧的索引

问题描述

我有一个带有索引的数据框

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 中的索引?

标签: pandas

解决方案


我相信需要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

推荐阅读