2016-07-20 2 views
1

Ich habe eine riesige pandasDataFrame, die wie dieser (Probe) aussieht:Das Umbenennen von Pandas Col durch Dictionary hat keine Auswirkungen auf den ursprünglichen DataFrame?

df = pd.DataFrame({"col1":{0:"There ARE NO ERRORS!!!", 1:"EVERYTHING is failing", 2:"There ARE NO ERRORS!!!"}, "col2":{0:"WE HAVE SOME ERRORS", 1:"EVERYTHING is failing", 2:"System shutdown!"}}) 

Ich habe eine Funktion cleanMessage genannt, die Zeichensetzung Streifen und Klein String zurückgibt. Zum Beispiel würde cleanMessage("THERE may be some errors, I don't know!!")there may be some errors i dont know zurückgeben.

Ich versuche, jede Nachricht in col1 mit was auch immer cleanMessage zurückgibt für diese bestimmte Nachricht (grundsätzlich Reinigung dieser Nachricht Spalten nach oben). pd.DataFrame.iterrows funktionierte OK für mich, war aber ein bisschen langsam. Ich versuche, in der ursprünglichen df neuen Werte an die Schlüssel grundsätzlich Karte, etwa so:

message_set = set(df["col1"]) 
message_dict = dict((original, cleanMessage(original)) for original in message_set) 
df = df.replace("col1", message_dict) 

So, das Original df möchte:

>>> df 
    col1      col2 
0 "There ARE NO ERRORS"  "WE HAVE SOME ERRORS" 
1 "EVERYTHING is failing" "EVERYTHING is failing" 
2 "There ARE NO ERRORS!!!" "System shutdown!" 

Und die "nach" df sollte wie folgt aussehen:

>>> df 
    col1      col2 
0 "there are no errors"  "WE HAVE SOME ERRORS" 
1 "everything is failing" "EVERYTHING is failing" 
2 "there are no errors"  "System shutdown!" 

Bin ich etwas mit dem replace Teil meines Codes fehlt?

Edit:

Für zukünftige Zuschauer, hier ist der Code, den ich zu arbeiten habe:

df["col1"] = df["col1"].map(message_dict) 
+1

derzeit df.replace() wird für alle Instanzen von "col1" suchen (die Zeichenfolge, anstatt die Serie) –

+0

Warum nicht einfach tun 'df [ "col1" ] = [cleanMessage (s) für s in df ["col1"]] '? –

+0

@JBr, also was sollte die Syntax dann sein, wenn ich schaue, um diese Spalte zu ersetzen? 'df = df.replace (df [" col1 "], message_dict)'? – blacksite

Antwort

1

replace funktioniert gut mit regex - betrachten die Logik der clean message() in eine verschachtelte replace() setzen.

df["col2"] = df["col1"].replace(...).replace(...) 
0
df.col1 = df.col1.str.lower().str.replace(r'([^a-z ])', '') 

df 

enter image description here

Verwandte Themen