2016-04-08 15 views
1

私は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'] 
+1

これは$$で大規模な痛みになります、あなたは下げて大文字と小文字を区別し、スペルを正規化し、levenshteinやjaccardなどの類似点を計算しますが、これに加えてさまざまな言語のエントリがあります!何らかの辞書にアクセスできれば、これらのエントリをマップして同じルートワードに正規化することができます – EdChum

+1

私は正規表現でこれをすべて実際にやっているのはひどく遅いと思います。 – n1c9

+0

@ n1c9 'df.column_a = df.column_a.str.lower()'と 'df.column_a = df.column_a.str.strip()'を実行することは、実際には非常に迅速です。とにかくこれを一度だけ行う必要があり、長期的にソリューションがどれほどうまくいくかには関心がありません。 – Thanos

答えて

1

使用ブールインデックスはNULL値が、その後これを行うがある場合document

In [143] df[df.column_a.str.contains(r'\bwar.*')] 
    Out [143] 
    0  warsaw 
    2 warszawa 
    4 warsawa 
    10 warschau 

を参照してください。

df[pd.notnull(df.column_a) & df.column_a.str.contains(r'\bwar.*')] 
+0

ありがとう! 'ValueError:NA/NaN値を含むベクトルでインデックスできません。 '私はすべてのNaN値を空の文字列またはそれに似たものに置き換えようとすべきです。 – Thanos

+0

答えを更新する - ヌル値がある場合はどうなりますか – Abbas

0

DataFrame列に一意の値を返す検索を実行する方法が見つかりました。代わりに値をextractに解決することです。上記のような問題については

は、私が代わりに str.contains()

In [1311]: df.column_a.str.extract(r"\b(war.*)").unique() 
Out[1311]: 
array(['warsaw', nan, 'waraszawa', 'warszawskiej', 'warszawy', 'warzawa', 
    'warsza', 'warrszawa', 'warzszawa', 'warszawan', 'warszawie', 
    'warwszawa', 'warszawski', 'warzno 84-208', 'warasza, wola', 
    'warszawskie', 'warzsawa', 'warzno', 'warszawa', 'warszwa', 'warsawa'], dtype=object) 

がよりよい解決策があるかもしれないもののstr.extract()を使用しているが、これは確かです。 -

関連する問題