2017-07-09 13 views
0

が含まれている場合、私は下図のように12桁の数字が含まれている大量のデータ列を解析しようとしている数を返すために正規表現を使用して:パンダ重複桁

0 802112134267 
1 300949934377 
2 300999934377 
3 222589009836 
4 950279219923 
Name: number, dtype: object 

私は3またはを持つ任意の数をつかむしたいですより多くの繰り返し文字。行2は4 '9を含み、行3は3' 2を含む。返信したいと思います:

0 None 
1 None 
2 300999934377 
3 222589009836 
4 None 
Name: number, dtype: object 

または切り捨てられた/フィルタリングされたデータフレーム/シリーズで十分です。私はこれは解くを考える

正規表現:「(\ d)は\ 1 {2、}」

はしかし、私は正常シリーズに、この正規表現を適用することができていません。

regex = re.compile('(\d)\1{2,}') 
s.apply(lambda x: np.nan if regex.search(x) == None else x) 

はすべてNaNを返します。

s.str.extract('(\d)\1{2,}', expand=True) 

すべてのNaNを返します。

s.str.contains('(\d)\1{2,}') 

はすべて偽を返します。

ご協力いただければ幸いです。私はフォーラムを検索しようとしましたが、うまくいかない例は見つかりませんでした。

WiktorStribiżewの正規表現@おかげ

+5

'r '(\ d)\ 1 {2、}''。 –

答えて

2

は正しいです。彼の答えに加えて、あなたの列を除外する簡単な方法を提供したいと思います。

あなたの行をフィルタリングするdf.where機能を使用することができます。

In [1524]: df['Col1'] = df.where(df['Col1'].str.contains(r'(\d)\1{2,2}'), other=None) 

In [1525]: df['Col1'] 
Out[1525]: 
0   None 
1   None 
2 300999934377 
3 222589009836 
4   None 
Name: Col1, dtype: object 

df['Col1'].str.containsその後、df.whereを使用してデータフレームに適用されるブールマスクを返します。 other=Noneは、あなたのパターンと一致しない要素の代わりにNoneを入れなければならないと指定します。

正規表現のコンパイルをスキップすることができます。ラムダはもう必要ありません。

関連する問題