2016-04-25 8 views
0

Ich habe eine Funktion definiert, die die Aufgabe ausführt, die ich will, aber es ist schrecklich langsam. Für ein DataFrame (df1=pd.read(file1)) mit Kopf 'raw_data' ich zur Zeit durchläuft jede Saite mit .iterows und jeden Eintrag auf eine Funktion, und dann str.replace(row['replacethis'],row['withthis']) verwendet, die Streifen und absenkt schicken, wo 'replacethis' und 'withthis' sind Spalten in einer zweiten DataFrame ((df2=pd.read(file2)).Ersetzen von Datenrahmeneinträgen durch einen anderen Datenrahmeneintrag (Serie?)? vektorisieren? Kompression?

Dies ist jedoch extrem langsam, es dauert ein paar Tage für eine sehr große Anzahl von Elementen von file1/file2. Ich habe mehrere Stunden/Tage nach Lösungen suchen, und ich habe mit etwas ohne Erfolg series.str.replace mit Liste Kompression versucht, mit wie:

'raw_data'=[[x['raw_data'].replace(y['replacethis'],y['withthis']) for y in df2.iterrows()] for x in df1.iterrows()] 

Kann jemand eine Anleitung oder beraten? Das macht mich verrückt.

+0

nach dem Strippen und unteren Gehäuse macht die Zeichenfolge genau übereinstimmen 'replacethis' oder ist es nur enthalten' den String-Inhalt ersetzen? – EdChum

+0

für eine Version der Funktion ist eine exakte Übereinstimmung (ich verwende wenn str == row ['raw_data'] in der Funktion), und für einige ist es ein Teilstring ... – PythonNoob123

+0

Nun für den Teilstring Teil erwarten Sie 1 oder mehr als 1 Übereinstimmung und auch für die genaue Übereinstimmung? Für die genauen Übereinstimmungen könntest du einfach auf diese Spalten "fusionieren", für das andere Bit glaube ich nicht, dass du viel mehr tun kannst, als "str.contains" oder ähnliches zu durchlaufen und zu verwenden. – EdChum

Antwort

0

Der beste Weg ist wahrscheinlich Pandas' DataFrame.replace Methode zu verwenden:

# The raw_data DF 
df1 = pd.DataFrame({'raw_data': ['Lorem', 'ipsum', 'dolor', 'sit', 'amet,', 
           'consectetur', 'adipiscing', 'elit']}) 
print 'Original:' 
print df1 

# The replacement patterns DF 
df2 = pd.DataFrame({'replacethis': ['ipsum', 'it'], 'withthis': ['doggy', 'THAT']}) 
pattern_dict = df2.set_index('replacethis')['withthis'].to_dict() 

df1_replaced = df1.replace(pattern_dict, regex=True) 
print '\nAfter Replacement:' 
print df1_replaced 

Ergebnis:

Original: 
     raw_data 
0  Lorem 
1  ipsum 
2  dolor 
3   sit 
4  amet, 
5 consectetur 
6 adipiscing 
7   elit 

After Replacement: 
     raw_data 
0  Lorem 
1  doggy 
2  dolor 
3  sTHAT 
4  amet, 
5 consectetur 
6 adipiscing 
7  elTHAT 
+0

hervorragend, nochmals eine Million und eine Million. – PythonNoob123

Verwandte Themen