私は100万以上の行を持つpandas DataFrameを持っており、データを正規化しようとしている過程で一意の値を見つける必要があります。指定された列のデータは、タイプの文字列(都市名を表す)です - そして、データを正規化する際に、列内のすべての値を小文字にして特定のステップを実行することで、すでに長い道のりを歩み、pandas.core.frame.DataFrame.replace()
データのために明らかだった。正規表現と一致する実際の一意の値を見つける方法
のサンプル私が持っている(と私が達成したい)下記見つけたもの:これよりもデータの
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
だけはるかに大きいセット、私はREGを使用して別の都市名のバリエーションを検索する必要があるよう式を使用してデータセットのバージョンに存在するものをすべて見つけ出し、正規化を続行します。
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
私は.str.contains()
で試してみましたが、私が唯一持っているそれらの指標のためのブール値を取得しています - 定義された列の下に - 指定した正規表現に一致する値:
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
...
しかし、私は何探しているのは正規表現と一致する実際の値を取得することです。上記の例では、次のようなものを得ることができます:
['warsaw','warszawa','warsawa','warschau']
これは$$で大規模な痛みになります、あなたは下げて大文字と小文字を区別し、スペルを正規化し、levenshteinやjaccardなどの類似点を計算しますが、これに加えてさまざまな言語のエントリがあります!何らかの辞書にアクセスできれば、これらのエントリをマップして同じルートワードに正規化することができます – EdChum
私は正規表現でこれをすべて実際にやっているのはひどく遅いと思います。 – n1c9
@ n1c9 'df.column_a = df.column_a.str.lower()'と 'df.column_a = df.column_a.str.strip()'を実行することは、実際には非常に迅速です。とにかくこれを一度だけ行う必要があり、長期的にソリューションがどれほどうまくいくかには関心がありません。 – Thanos