Панды: Изменить определенный уровень Multiindex, используя метод замены несколько раз - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь использовать метод замены несколько раз для того, чтобы изменить значения данного уровня в кадре данных мультииндексных панд.

Как видно здесь: Панды: измените определенный уровень Multiindex , @John получил решение, которое прекрасно работает, пока метод замены используется один раз.

Проблема в том, что он не работает, если я использую этот метод несколько раз. Э.Г.

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

Я получаю следующее сообщение об ошибке:

AttributeError: 'Index' object has no attribute 'replace'

Чего мне не хватает?

1 Ответ

0 голосов
/ 08 ноября 2018

Используйте str.replace дважды:

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

Другим решением является преобразование 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)

И решение с 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)

Sample

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
...