如何在Pandas栏中找到连续重复的数字?

k10s72fa  于 2023-03-11  发布在  其他
关注(0)|答案(3)|浏览(184)

我有两列,一列包含一串数字,一列包含两个或三个数字,如下所示:

Account number     
0   5493455646944        
1   56998884221          
2   95853255555926       
3   5055555555495718323  
4   56999998247361       
5   6506569568

我想创建一个regex函数,如果帐号包含5个或更多连续重复的数字,它会显示一个标志。
因此,理论上,目标状态如下:

Account number     test
0   5493455646944        No
1   56998884221          No
2   95853255555926       Yes
3   5055555555495718323  Yes
4   56999998247361       Yes
5   6506569568           No

我在想:

def reg_finder(x):
    return re.findall('^([0-9])\1{5,}$', x)

我不擅长使用regex,所以不确定...谢谢
编辑:这是我试过的:

def reg_finder(x):
    return re.findall('\b(\d)\1+\b', x)

example_df['test'] = example_df['Account number'].apply(reg_finder)

    Account number      test
0   5493455646944        []
1   56998884221          []
2   95853255555926       []
3   5055555555495718323  []
4   56999998247361       []
5   6506569568           []
bejyjqdl

bejyjqdl1#

正则表达式re.findall('^([0-9])\1{5,}$', x)中的问题:
1.你使用^$,用来匹配整个字符串是连续的。
1.您要匹配的 * 包含5个以上的 *,\1已经是一个匹配项,您只需要4个以上。
您可以使用

df['test'] = np.where(df['Account number'].astype(str).str.contains(r'([0-9])\1{4,}'), 'Yes', 'No')

# Or

df['test'] = np.where(df['Account number'].astype(str).str.contains(r'(\d)\1{4,}'), 'Yes', 'No')
print(df)

        Account number test
0        5493455646944   No
1          56998884221   No
2       95853255555926  Yes
3  5055555555495718323  Yes
4       56999998247361  Yes
5           6506569568   No
tvokkenx

tvokkenx2#

您可以使用

import pandas as pd
import warnings
warnings.filterwarnings("ignore", message="This pattern has match groups")

df = pd.DataFrame({'Account number':["5493455646944","56998884221","95853255555926","5055555555495718323","56999998247361","6506569568"]})
df['test'] = "No"
df.loc[df["Account number"].str.contains(r'([0-9])\1{4,}'), 'test'] = "Yes"

输出:

>>> df
        Account number test
0        5493455646944   No
1          56998884221   No
2       95853255555926  Yes
3  5055555555495718323  Yes
4       56999998247361  Yes
5           6506569568   No

注意,r'([0-9])\1{4,}'正则表达式是用原始字符串文字定义的,其中反斜杠被解析为文字反斜杠,而不是字符串转义序列辅助字符。

dzjeubhm

dzjeubhm3#

dd1=df1.assign(col1=df1['Account number'].astype(str).map(list)).explode("col1")
col2=dd1.col1.ne(dd1.col1.shift()).cumsum()
dd2=dd1.assign(test=col2).assign(col3=lambda dd:dd.groupby(['Account number',col2]).test.transform('size'))
dd2.groupby("Account number",sort=False,as_index=False).apply(lambda dd:"yes" if dd.col3.ge(5).any() else "no")

输出:

Account number test
0        5493455646944   No
1          56998884221   No
2       95853255555926  Yes
3  5055555555495718323  Yes
4       56999998247361  Yes
5           6506569568   No

相关问题