2017-09-07 1 views
-1
나는 다른 문자열 멀티 인덱스의 레벨 1에 문자열을 대체하기 위해 노력하고 두 dataframes을 가지고 있지만이

는 dataframe에 교체 작업 MultiIndex

실패 예를 들어 내가

Index0 Index1 0  1  2 
A  BX  .2 .3 .9  
     CX  .34 .55 .54   

D  EX  .34 .44 .32 
     FX  .43. .88. .06 

I DF dataframe을

대체 을 시도하고있는이 Y에 의해 X 문자열 INDEX1 내 결과
는 리터를 보이는 그래서

Index0 Index1 0  1  2 
A  BY  .2 .3 .9  
     CY  .34 .55 .54   

D  EY  .34 .44 .32 
     FY  .43. .88. .06 

을 다음과 같이 난 그냥 느린 대체를 떠나도록 이케 나는

df.replace('X','Y') 

그러나 내가 cᴏʟᴅsᴘᴇᴇᴅ @

AttributeError     Traceback (most recent call last) 
<ipython-input-56-fc7014a2d950> in <module>() 
    8 
    9 
---> 10 df.replace('X','Y') 

AttributeError: 'MultiIndex' object has no attribute 'replace' 
+0

안양을 만들기위한 코드를 추가하십시오보십시오와 대조. 실제로,'df'는 인덱스처럼 보입니다. –

+0

df는 데이터 프레임입니다. Index0과 Index1은 df 데이터 프레임의 인덱스입니다. – user2560244

+0

AttributeError 트레이스 백 (지난 최근 통화) ()에 ---> 10 df.replace ('X', 'Y') AttributeError ' MultiIndex '객체에'replace '속성이 없습니다. – user2560244

답변

2

내 대답에 개선 된 다음과 같은 오류를 얻을 다음과 같은 기능을 사용하고 있습니다 여기 ...

import numpy as np 
df = pd.DataFrame(np.random.randn(4,3), 
        index=[list('aabb'), [n + 'X' for n in list('abcd')]]) 

reset_index을 사용하는 다른 방법이 있습니다. 둘 이상의 열에서 대체하려는 경우 적용 할 수 있습니다. 트릭은 인덱스에 replace을 사용할 수 없으므로 DataFrame에 "가져와야"한다는 것입니다.

new = (df.reset_index() 
      .select_dtypes(include=['object']) 
      .apply(lambda col: col.str.replace('X', 'Y'))) 

df.index = pd.MultiIndex.from_tuples(new.values.tolist()) 
+0

좋은 접근법 - 나는'reset_index'를 사용하여 인덱스를 편집 가능한 데이터 프레임 컬럼으로 밀어 넣은 다음,'set_index'를 사용하여 그 값을 다시 인덱스로 밀어 넣었습니다. 이것은 덜 침략 적이다; 더 우아한. – jdg

+0

간단한 교체 만하기 위해 시리즈를 사용하는 것이 가장 좋은 방법이라고 생각하지 않습니다. –

+0

내 이름의 오타가 의도적으로 수행 되었습니까? : p –

2

당신이 필요 이상으로하고 있습니다.

df 
        0  1  2 
Index0 Index1     
A  BX  .2 .3 0.90 
     CX  .34 .55 0.54 
D  EX  .34 .44 0.32 
     FX  .43. .88. 0.06 

pd.MultiIndex.from_arrays을 사용하면 한 단계로 처리 할 수 ​​있습니다.

df.index = pd.MultiIndex.from_arrays([df.index.get_level_values(0), 
             df.index.levels[1].str.replace('X', 'Y')]) 

df 
        0  1  2 
Index0 Index1     
A  BY  .2 .3 0.90 
     CY  .34 .55 0.54 
D  EY  .34 .44 0.32 
     FY  .43. .88. 0.06 

작은 dataframe에 대한 성능

%%timeit 
new = (df.reset_index() 
      .select_dtypes(include=['object']) 
      .apply(lambda col: col.str.replace('X', 'Y'))) 

df.index = pd.MultiIndex.from_tuples(new.values.tolist()) 

10 loops, best of 3: 93.5 ms per loop 

거의 100ms.

%%timeit 
df.index = pd.MultiIndex.from_arrays([df.index.get_level_values(0), 
             df.index.levels[1].str.replace('X', 'Y')]) 

1000 loops, best of 3: 934 µs per loop 
+0

woww ... 이것은 아주 좋습니다. 덕분에 – user2560244

+0

당신이 맞습니다,'str.replace'는 인덱스에서 작동 할 수 없다고 생각했습니다. 이것은 받아 들여진 대답 일 것입니다 @ user2560244 –

+0

이것은 내 마음에 무엇입니까! :) – Wen

1

을 또는이

df.index=pd.MultiIndex.from_tuples([(x[0], x[1].replace('X', 'Y')) for x in df.index]) 
df 
Out[304]: 
      0   1   2 
a aY -0.696181 -1.929523 -1.903956 
    bY 0.071061 -0.594185 -2.005251 
b cY -0.097761 0.093667 1.780550 
    dY 0.127887 1.534395 0.352351 
+1

여기에 루프가 있습니다. 그러나 여전히, 더 좋습니다. –