2016-06-07 6 views
0

DataFrameA에서 다른 것으로 값을 매핑하는 빠르고 깨끗한 방법을 찾으려고합니다.하나의 DataFrame에서 다른 값으로 매핑하기

C1 C2 C3 C4 C5 
1 a b c a 
2 d a e b a 
3 a c 
4 b e e 

그리고 지금은 실제 값에 그 문자 코드를 변경하려면 : 나는 DataFrame 하나 같이이 있다고 가정하자. 내 DataFrameB와 설명은 다음과 같습니다

Code Value 
1 a  'House' 
2 b  'Bike' 
3 c  'Lamp' 
4 d  'Window' 
5 e  'Car' 

지금까지 내 무차별 접근 방식은 단지 A의 모든 요소를 ​​통해 이동하고 Bisin()와 값을 확인하는 것이 었습니다. 나도 DataFrame 대신 B으로 Series (또는 간단한 사전)을 사용할 수 있으며 예를 들어 Code 열을 색인으로 사용할 수 있음을 알고 있습니다. 하지만 여전히 모든 것을 매핑하기 위해 다중 루프를 사용해야 할 것입니다.

내 목표를 달성하기위한 다른 좋은 방법이 있습니까?

답변

3

또 다른 대안이 map입니다 산출한다. 그것이 내가 엉망으로 테스트를하지 않은 경우 열을 통해 루프 필요하지만, 그것은 대체보다 여전히 빠르다 :

A = pd.DataFrame(np.random.choice(list("abcdef"), (1000, 1000))) 
B = pd.DataFrame({'Code': ['a', 'b', 'c', 'd', 'e'], 
        'Value': ["'House'", "'Bike'", "'Lamp'", "'Window'", "'Car'"]}) 
B = B.set_index("Code")["Value"] 

%timeit A.replace(B) 
1 loop, best of 3: 970 ms per loop 

C = pd.DataFrame() 

%%timeit 
for col in A: 
    C[col] = A[col].map(B).fillna(A[col]) 
1 loop, best of 3: 586 ms per loop 
2

당신은 replace을 사용할 수


import pandas as pd 
A = pd.DataFrame(
    {'C1': ['a', 'd', 'a', 'b'], 
    'C2': ['b', 'a', 'c', 'e'], 
    'C3': ['c', 'e', '', 'e'], 
    'C4': ['a', 'b', '', ''], 
    'C5': ['', 'a', '', '']}) 
B = pd.DataFrame({'Code': ['a', 'b', 'c', 'd', 'e'], 
        'Value': ["'House'", "'Bike'", "'Lamp'", "'Window'", "'Car'"]}) 
print(A.replace(B.set_index('Code')['Value'])) 

A.replace(B.set_index('Code')['Value']) 

  C1  C2  C3  C4  C5 
0 'House' 'Bike' 'Lamp' 'House'   
1 'Window' 'House' 'Car' 'Bike' 'House' 
2 'House' 'Lamp'       
3 'Bike' 'Car' 'Car'     
관련 문제