我试图分析包含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,}')
返回全部错误。
任何帮助将不胜感激。我试过搜索论坛,但没有发现任何有用的好例子。
由于
答案 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了。