将值从一个DataFrame映射到另一个DataFrame

时间:2016-06-07 17:49:54

标签: python pandas

我正在尝试找出一种快速而干净的方法,将值从一个DataFrame A映射到另一个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喜欢这个:

B

现在我想将这些字母代码更改为实际值。我的 Code Value 1 a 'House' 2 b 'Bike' 3 c 'Lamp' 4 d 'Window' 5 e 'Car' A解释如下:

isin()

到目前为止,我的蛮力方法只是浏览B中的每个元素,并使用Series B中的值进行检查。我知道我也可以使用DataFrame(或简单字典)作为Code而不是mkdir mraa/build && cd $_ cmake .. -DBUILDSWIGNODE=OFF make make install ,并使用例如uuid列作为索引。但我仍然需要使用多个循环来映射所有内容。

还有其他很好的方法来实现我的目标吗?

2 个答案:

答案 0 :(得分:4)

您可以使用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'                  

答案 1 :(得分: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