Ich habe eine Pandas DataFrame mit über einer Million Zeilen und ich muss alle eindeutigen Werte (für eine bestimmte Spalte) im Prozess der Normalisierung der Daten zu finden. Die Daten in der gegebenen Spalte sind vom Typ string - Stadtnamen repräsentierend - und ich bin schon weit gekommen, um die Daten zu normalisieren, indem ich bestimmte Schritte unterniedrigere alle Werte in der Spalte striping und pandas.core.frame.DataFrame.replace()
mit regulären Ausdrücken verwende schien für die Daten offensichtlich.So finden Sie tatsächliche eindeutige Werte in Pandas DataFrame, die eine Regex
Eine Probe von dem, was ich habe (und ich mag erreichen) wie folgt zu finden:
In [1018]: sample
Out[1018]:
0
0 warsaw ## -> warsaw
1 krakow ## -> krakow
2 warszawa ## -> warsaw
3 cracovie ## -> krakow
4 warsawa ## -> warsaw
5 krkow ## -> krakow
6 krąków ## -> krakow
7 krakowie ## -> krakow
8 kraków ## -> krakow
9 varşovia ## -> warsaw
10 warschau ## -> warsaw
nur viel größer Satz von Daten als diese, so dass ich für Variationen verschiedenen Städtenamen suchen muß reg verwenden Ausdrücke, um alle in den Datensätzen vorhandenen Versionen zu finden und mit der Normalisierung fortzufahren.
In [1023]: df.column_a.unique()
Out[1023]:
array(['warsaw', 'bydgoszcz', 'null', ..., 'kłodawa', 'kościelna wieś',
'poznań-jeżyce'], dtype=object)
In [1024]: len(df.column_a.unique())
Out[1024]: 3798
ich mit .str.contains()
versucht habe, aber ich bin nur ein boolean für die Indizes erhalten, die hat - unter der definierten Spalte - Werte, die den angegebenen regulären Ausdruck entsprechen:
In [1029]: df.column_a.str.contains(r"\bwar.*")
Out[1029]:
0 True
1 False
2 False
3 True
4 False
5 False
6 False
7 False
8 False
9 False
10 False
...
Aber was ich bin Das Suchen nach ist, um die tatsächlichen Werte zu erhalten, die der gegebenen Regex entsprechen. Für das obige Beispiel würde Ich mag, um etwas zu bekommen wie:
['warsaw','warszawa','warsawa','warschau']
Dies wird ein massiver Schmerz in der A $$ sein, müssen Sie senken -case, normalisiere die Schreibweisen, berechne irgendeine Art von Ähnlichkeit wie Levenshtein oder Jaccard, aber darüber hinaus hast du Einträge in verschiedenen Sprachen !! Wenn Sie Zugang zu einer Art von Wörterbuch haben, dann können Sie diese Einträge zuordnen und sie zu dem gleichen Stammwort normalisieren. – EdChum
Ich könnte mir vorstellen, dass das alles mit Regex zu tun wäre * schrecklich * langsam. – n1c9
@ n1c9 Running 'df.column_a = df.column_a.str.lower()' und 'df.column_a = df.column_a.str.strip()' ist in der Tat sehr schnell. Ich muss das nur einmal tun, nicht daran interessiert, wie gut die Lösung auf lange Sicht funktioniert. – Thanos