2017-02-23 6 views
1

Ich habe derzeit einen Datensatz, der Fuzzy-Logik verbunden werden muss. Dataframe df1 ist die kleinere Referenztabelle mit etwa 10 Beobachtungen. Dataframe df2 ist mein Hauptdatenrahmen mit ungefähr 2000 Beobachtungen, bei denen der Fuzzy-Logic-Join durchgeführt werden muss. Ich präsentiere das Beispiel und meinen Versuch unten.Python Pandas Fuzzy Logik

import difflib 
df1 = pd.DataFrame({'number':[1,2,3,4,5],'not_shifted':['one','two','three','four','five']}) 
df2 = pd.DataFrame({'values':[['test'],['a'],['b'],['c'],['d'],['e'],['f'],['f'],['f']],'not_shifted':[np.nan,'one','too','three','fours','five','six',np.nan,'one']}) 

# my approach 
df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])[0]) 

ich die folgende Fehlermeldung erhalten: Liste außerhalb des zulässigen Bereichs

TypeError: 'float' object is not utterable

Wenn ich die np.nan mit etwas anderes ersetzen, erhalte ich einen anderen Fehler:

List out of range

Antwort

1

Sie erhalten TypeError Da Datenrahmen df2 Nan ​​Werte hat, müssen Sie es fallen lassen.

Ein weiteres Problem: df1 hat keine Regel für 'sechs' und df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])[0]) erzeugt einen Fehler List out of range, weil eine der Listen leer ist.

Ihr Code wird wie folgt aussehen (oder Sie können Ihren_Approach verwenden, wenn Sie zu df1 eine Regel für 'six' hinzufügen).

import pandas as pd 
import numpy as np 
import difflib 

df1 = pd.DataFrame({'number':[1,2,3,4,5],'not_shifted':['one','two','three','four','five']}) 
df2 = pd.DataFrame({'values':[['test'],['a'],['b'],['c'],['d'],['e'],['f'],['f'],['f']],'not_shifted':[np.nan,'one','too','three','fours','five','six',np.nan,'one']}) 

# Drop nan value 
df2=df2.dropna() 

# You cat write [0] because df1 does not have 'six' 
df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])) 
print df2 

Ausgang:

not_shifted values 
1  [one] [a] 
2  [two] [b] 
3  [three] [c] 
4  [four] [d] 
5  [five] [e] 
6   [] [f] 
8  [one] [f] 
+0

Hallo Serenity, vielen Dank für die schnelle Antwort und Lösung :) – Seb

+0

Hallo Serenity, Wie kann ich von den eckigen Klammern in dem Datenrahmen loszuwerden. Die Antwort ist richtig, jedoch verursachen die eckigen Klammern in der Lösung ein wenig Verwirrung. Was ist der Zweck, eine Liste in diesem Datenrahmen zu definieren? Vielen Dank. – Seb