2017-03-07 5 views
1

Ich habe einen großen Datenrahmen mit Personen Daten. Ich möchte alle seltsamen Diakritika abflachen und sie in den nächsten Ascii-Charakter konvertieren. Auf der Basis einer Lösung fand ich SO in ich folgendes:Normalisierung vermisst polnische Zeichen

for column in df.columns: 
      df[column] = df[column].astype("str").str.normalize('NFKD').str.encode('ascii', errors='ignore').str.decode('utf-8') 

Es ist für den meisten Fällen funktioniert (nicht überprüft sie alle) aber habe ich bemerkt, es Buchstaben ‚L‘ in der polnischen vermisst. Zum Beispiel wird Lech Wałęsa in Lech Waesa übersetzt, während meine Erwartung wäre, Lech Walesa zu sehen. Meine Vermutung wäre, dass es ignore Parameter in str.encode Methode ist. Irgendeine Idee, wie man es für irgendein diakritisches arbeitet?

Antwort

1

Versuchen Sie mit unidecode, arbeitete perfekt für das Beispiel, das Sie beschrieben.

from unidecode import unidecode 

for column in df.columns: 
    df[column] = [unidecode(x) for x in df[column].values] 
+0

Dies funktionierte perfekt für mich. Ich wähle es als die beste Antwort wegen seiner Einfachheit. – pawelty

1

Betrachten Sie, was normalize('NFKD') tatsächlich tut, um Ihre Eingabestring "Lech Wałęsa":

import unicodedata 
s = "Lech Wałęsa" 
print(list(unicodedata.normalize("NFKD", s))) 

['L', 'e', 'c', 'h', ' ', 'W', 'a', 'ł', 'e', '̨', 's', 'a'] 

Wie Sie sehen können, das Zeichen ‚E‘ in den Buchstaben ‚e‘ zerlegt und die diakritischen ‚̨‘ , aber für "ł" findet keine solche Zersetzung statt. Es scheint, dass die Unicode-Zeichen LATIN SMALL LETTER L mit Strich 'ł' und LATIN CAPITAL LETTER L mit Strich '£ among the few characters sind, für die die Unicode-Dekomposition nicht funktioniert. Jetzt

, wenn Sie die Ausgabe von normalize("NFKD") als Eingabe verwenden für encode("ascii", errors="ignore"), was passiert, ist, dass alle Zeichen, die nicht als ASCII-Zeichen ausgedrückt werden kann stillschweigend ignoriert werden, mit dem Sie den Ausgang "Lech Waesa" gibt.

Was Sie tun könnten, um dieses Problem zu lösen, ist, die Ausnahmebedingung '£' und '³' manuell durch 'L' und 'l' zu ersetzen, bevor Sie die Diakritika aus den Zeichen entfernen, die die Dekomposition unterstützen. Sie müssten Ihren Code wie folgt ändern:

for column in df.columns: 
    df[column] = (df[column].astype("str") 
          .str.replace("ł", "l") 
          .str.replace("Ł", "L") 
          .str.normalize('NFKD') 
          .str.encode('ascii', errors='ignore') 
          .str.decode('utf-8')) 
+0

Danke für die Erklärung! Mir war nicht bewusst, dass die Unicode-Dekomposition für einige Zeichen nicht funktioniert. In meinen Daten kann ich all diese Zeichen erwarten, so dass ich für jede von ihnen eine separate Ersetzungsfunktion hinzufügen müsste. – pawelty