如果包含重复的数字,Pandas使用正则表达式返回数字

时间:2017-07-09 18:55:22

标签: python regex pandas dataframe

我试图分析包含12位数字的大量数据,如下所示:

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

我想抓住任何包含3个或更多重复字符的数字。第2行包含4	 9,第3行包含3 2' s。我想回来:

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,}')

返回全部错误。

任何帮助将不胜感激。我试过搜索论坛,但没有发现任何有用的好例子。

由于

1 个答案:

答案 0 :(得分:2)

@WiktorStribiżew的正则表达式是正确的。除了他的答案,我想为您提供一种更简单的方法来过滤您的专栏。

您可以使用task myZip(type: Zip) { from 'foo/bar' rename 'hello/world.xml' 'hello/universe.xml' } 功能过滤掉您的行:

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应该代替与您的模式不匹配的元素。

你可以跳过正则表达式编译,你不再需要lambda了。