2016-06-07 92 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 

,現在我想改變那些字母代碼,以實際值。我DataFrameB與解釋看起來像這樣:

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

到目前爲止,我的蠻力方法是剛剛經歷的每一個元素在ABisin()檢查值。我知道我也可以使用Series(或簡單字典)作爲B而不是DataFrame,並使用例如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

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

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'])) 

產生

  C1  C2  C3  C4  C5 
0 'House' 'Bike' 'Lamp' 'House'   
1 'Window' 'House' 'Car' 'Bike' 'House' 
2 'House' 'Lamp'       
3 'Bike' 'Car' 'Car'     
相關問題