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

seb*_*123 2 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
Run Code Online (Sandbox Code Playgroud)

现在,我想将这些字母代码更改为实际值。我DataFrame B的解释如下:

    Code    Value
1   a       'House'
2   b       'Bike'
3   c       'Lamp'
4   d       'Window'
5   e       'Car'
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的暴力破解方法只是遍历in中的每个元素A并检查isin()in中的值B。我知道我也可以使用Series(或简单的字典)B代替,DataFrame并使用例如Codecolumn作为索引。但是我仍然需要使用多个循环来映射所有内容。

还有其他不错的方法可以实现我的目标吗?

unu*_*tbu 6

你可以使用replace

A.replace(B.set_index('Code')['Value'])
Run Code Online (Sandbox Code Playgroud)
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']))
Run Code Online (Sandbox Code Playgroud)

产量

         C1       C2      C3       C4       C5
0   'House'   'Bike'  'Lamp'  'House'         
1  'Window'  'House'   'Car'   'Bike'  'House'
2   'House'   'Lamp'                          
3    'Bike'    'Car'   'Car'                  
Run Code Online (Sandbox Code Playgroud)


ayh*_*han 5

另一种选择是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"]
Run Code Online (Sandbox Code Playgroud)
%timeit A.replace(B)
1 loop, best of 3: 970 ms per loop
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)