2016-06-07 11 views
0

Ich versuche herauszufinden, einige schnelle und saubere Möglichkeit, Werte von einem DataFrameA zu einem anderen zuzuordnen. Lassen Sie sagen, ich DataFrame wie diese haben:Mapping von Werten von einem DataFrame zu einem anderen

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

Und jetzt will ich Istwerten diese Buchstabencodes ändern. Mein DataFrameB mit Erklärungen sieht wie folgt aus:

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

Bisher meine Brute-Force-Ansatz nur durch jedes Element zu gehen war in A und überprüfen Sie mit isin() den Wert in B. Ich weiß, dass ich auch Series (oder einfaches Wörterbuch) als B anstelle von DataFrame verwenden und zum Beispiel Code Spalte als Index verwenden kann. Aber ich müsste immer noch mehrere Loops verwenden, um alles zu kartieren.

Gibt es noch eine andere Möglichkeit, mein Ziel zu erreichen?

Antwort

3

Eine weitere Alternative ist map. Obwohl es Schleifen über Spalten erfordert, wenn ich die Tests nicht vermasseln tat, ist es immer noch schneller als ersetzen:

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

könnten Sie replace verwenden:

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

ergibt

  C1  C2  C3  C4  C5 
0 'House' 'Bike' 'Lamp' 'House'   
1 'Window' 'House' 'Car' 'Bike' 'House' 
2 'House' 'Lamp'       
3 'Bike' 'Car' 'Car'     
Verwandte Themen