2016-06-07 86 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'     
相关问题