Pandas:修改Multiindex的特定级别,多次使用replace方法

rub*_*bop 4 python multi-index dataframe pandas

我尝试多次使用替换方法,以便更改多索引熊猫数据帧的给定级别的索引。

如下所示:Pandas:修改 Multiindex 的特定级别,@John 得到了一个解决方案,只要使用一次替换方法,该解决方案就可以很好地工作。

问题是,如果我多次使用这个方法,它就不起作用了。例如

df.index = df.index.set_levels(df.index.levels[0].str.replace("dataframe_",'').replace("_r",' r'), level=0)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

AttributeError: 'Index' object has no attribute 'replace'
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

jez*_*ael 7

使用str.replace两次:

idx = df.index.levels[0].str.replace("dataframe_",'').str.replace("_r",' r')
df.index = df.index.set_levels(idx, level=0)
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是转换to_series然后replace通过字典:

d = {'dataframe_':'','_r':' r'}
idx = df.index.levels[0].to_series().replace(d)
df.index = df.index.set_levels(idx, level=0)
Run Code Online (Sandbox Code Playgroud)

如果大数据和性能很重要,则使用map和解决方案:fillna

d = {'dataframe_':'','_r':' r'}
s = df.index.levels[0].to_series()
df.index = df.index.set_levels(s.map(d).fillna(s), level=0)
Run Code Online (Sandbox Code Playgroud)

样本

df = pd.DataFrame({
        'A':['dataframe_','_r', 'a'],
        'B':[7,8,9],
        'C':[1,3,5],

}).set_index(['A','B'])

print (df)
              C
A          B   
dataframe_ 7  1
_r         8  3
a          9  5

d = {'dataframe_':'','_r':' r'}
idx = df.index.levels[0].to_series().replace(d)
df.index = df.index.set_levels(idx, level=0)
print (df)
      C
A  B   
   7  1
 r 8  3
a  9  5
Run Code Online (Sandbox Code Playgroud)