Python 使用正则表达式提取双空格后的整数

Python 使用正则表达式提取双空格后的整数,python,regex,pandas,extract,Python,Regex,Pandas,Extract,我有一个数据框,我想在双空格后提取数据。对于列NAME中的所有行,在整数之前的公司名称后面有一个双空格 NAME INVESTMENT PERCENT 0 APPLE COMPANY A 57 638 232 stocks OIL LTD 0.12322 1 BANANA 1 COMPANY B 12 946 201 stocks GOLD LTD 0.02768 2 ORANGE

我有一个数据框,我想在双空格后提取数据。对于列
NAME
中的所有行,在整数之前的公司名称后面有一个双空格

                                    NAME  INVESTMENT  PERCENT
0     APPLE COMPANY A  57 638 232 stocks     OIL LTD  0.12322
1  BANANA 1 COMPANY B  12 946 201 stocks    GOLD LTD  0.02768
2     ORANGE COMPANY C  8 354 229 stocks     GAS LTD  0.01786

df = pd.DataFrame({
    'NAME': ['APPLE COMPANY A  57 638 232 stocks', 'BANANA 1 COMPANY B  12 946 201 stocks', 'ORANGE COMPANY C  8 354 229 stocks'],
    'PERCENT': [0.12322, 0.02768 , 0.01786]
    })
我在前面提到过,但它也包括公司名称中的整数:

df['STOCKS']=df['NAME'].str.findall(r'\b\d+\b').apply(lambda x: ''.join(x))
相反,我尝试在双空格后提取

df['NAME'].str.split('(\s{2})')
其输出:

0       [APPLE COMPANY A,   , 57 638 232 stocks]
1    [BANANA 1 COMPANY B,   , 12 946 201 stocks]
2       [ORANGE COMPANY C,   , 8 354 229 stocks]
但是,我希望在双空格之后出现的整数被联接/合并并放入一个新列中

                 NAME  PERCENT  STOCKS
0     APPLE COMPANY A  0.12322  57638232
1  BANANA 1 COMPANY B  0.02768  12946201
2    ORANGE COMPANY C  0.01786  12946201
如何修改我的第二个函数以实现我的目标?

您可以尝试

df['STOCKS'] = df['NAME'].str.split(',')[2].replace(' ', '')
df['NAME'] = df['NAME'].str.split(',')[0]
你可以试试

df['STOCKS'] = df['NAME'].str.split(',')[2].replace(' ', '')
df['NAME'] = df['NAME'].str.split(',')[0]

可以使用“向后看”和“向前看”操作符

''.join(re.findall(r'(?<=\s{2})(.*)(?=stocks)',string)).replace(' ','')
参考:-


  • 可以使用“向后看”和“向前看”操作符

    ''.join(re.findall(r'(?<=\s{2})(.*)(?=stocks)',string)).replace(' ','')
    
    参考:-


  • 按照原始逻辑,您可以使用

    df['STOCKS'] = df['NAME'].str.extract(r'\s{2,}(\d+(?:\s\d+)*)', expand=False).str.replace(r'\s+', '')
    df['NAME'] = df['NAME'].str.replace(r'\s{2,}\d+(?:\s\d+)*\s+stocks', '')
    
    输出:

                     NAME  PERCENT    STOCKS
    0     APPLE COMPANY A  0.12322  57638232
    1  BANANA 1 COMPANY B  0.02768  12946201
    2    ORANGE COMPANY C  0.01786   8354229
    
    详细信息

    • \s{2,}(\d+(?:\s\d+*)
      用于提取两个或多个空格后第一次出现的空格分隔的连续数字块,并
      。替换(r'\s+','')
      随后删除该提取文本中的所有空格
    • .replace(r'\s{2,}\d+(?:\s\d+*\s+stocks'
      更新
      名称
      列中的文本,它删除2个或多个空格、连续空格分隔的数字块,然后删除1+空格和
      股票
      。实际上,如果有其他单词,最后一个
      \s+stocks
      可以替换为
      *

    遵循您可以使用的原始逻辑

    df['STOCKS'] = df['NAME'].str.extract(r'\s{2,}(\d+(?:\s\d+)*)', expand=False).str.replace(r'\s+', '')
    df['NAME'] = df['NAME'].str.replace(r'\s{2,}\d+(?:\s\d+)*\s+stocks', '')
    
    输出:

                     NAME  PERCENT    STOCKS
    0     APPLE COMPANY A  0.12322  57638232
    1  BANANA 1 COMPANY B  0.02768  12946201
    2    ORANGE COMPANY C  0.01786   8354229
    
    详细信息

    • \s{2,}(\d+(?:\s\d+*)
      用于提取两个或多个空格后第一次出现的空格分隔的连续数字块,并
      。替换(r'\s+','')
      随后删除该提取文本中的所有空格
    • .replace(r'\s{2,}\d+(?:\s\d+*\s+stocks'
      更新
      名称
      列中的文本,它删除2个或多个空格、连续空格分隔的数字块,然后删除1+空格和
      股票
      。实际上,如果有其他单词,最后一个
      \s+stocks
      可以替换为
      *

    另一种
    pandas
    方法,将
    股票
    转换为数字类型:

    df_split = (df['NAME'].str.extractall('^(?P<NAME>.+)\s{2}(?P<STOCKS>[\d\s]+)')
                .reset_index(level=1, drop=True))
    
    df_split['STOCKS'] = pd.to_numeric(df_split.STOCKS.str.replace('\D', ''))
    

    另一种
    pandas
    方法将
    STOCKS
    转换为数字类型:

    df_split = (df['NAME'].str.extractall('^(?P<NAME>.+)\s{2}(?P<STOCKS>[\d\s]+)')
                .reset_index(level=1, drop=True))
    
    df_split['STOCKS'] = pd.to_numeric(df_split.STOCKS.str.replace('\D', ''))
    

    这可以通过split在不使用regex的情况下完成

    df['STOCKS'] = df['NAME'].apply(lambda x: ''.join(x.split('  ')[1].split(' ')[:-1]))
    df['NAME'] = df['NAME'].str.replace(r'\s?\d+(?:\s\d+).*', '')
    

    这可以通过split在不使用regex的情况下完成

    df['STOCKS'] = df['NAME'].apply(lambda x: ''.join(x.split('  ')[1].split(' ')[:-1]))
    df['NAME'] = df['NAME'].str.replace(r'\s?\d+(?:\s\d+).*', '')
    


    为什么要使用正则表达式?它很慢,可以在两个空格上拆分(
    .split(“”)
    )此外,我假设通过删除第一列并创建一个新列,同时将内容放入其中,就可以了。为什么要使用正则表达式?它很慢,可以在两个空格上拆分(
    .split(“”)
    )此外,我假设通过删除第一列并创建一个新列,同时将内容放入其中,他可以只执行
    .split(“”)[1].split()[0]
    ,这比regex(第一个split中有2个空格)@Mataunited17快得多。您能告诉我您尝试执行的操作吗?应该可以fine@Nenri我做了
    df['NAME'].str.split(“”)[1].split()[0]
    这给了我一个错误:“list”对象没有属性“split”。这很奇怪,因为我有一个数据帧。是的,
    .str
    应该返回一个string@Justice_Lords当我将您的第二个解决方案应用于我的原始数据帧时,当名称非常长时,结果会很奇怪。有没有办法解决这个问题?我想已经解决了关于
    x:x[x.find(“”)+2:x.find('stocks')
    +2
    部分,或者他可以做
    .split(“”)[1].split()[0]
    这比regex(第一次拆分中有两个空格)快得多@Mataunited17你能告诉我你试过做什么吗?那应该很管用fine@Nenri我做了
    df['NAME'].str.split('')[1].split()[0]
    这给了我一个错误:“list”对象没有属性“split”。这很奇怪,因为我有一个数据帧。是的,
    .str
    应该返回一个string@Justice_Lords当我将您的第二个解决方案应用于我的原始数据帧时,当名称非常长时,结果会很奇怪。有没有办法解决这个问题?我想已经解决了要处理
    x:x[x.find(“”)+2:x.find('stocks')
    Thx的
    +2
    部分,但是他的字符串中没有逗号,您应该在空格上拆分,因为一个人有两个空格,所以应该是
    .split()[3]。split()[0]
    哦,对不起,我忘记换衣服了it@Vaghinak这也不起作用。我收到错误消息:“list”对象没有属性“replace”@Mataunited17,因为你需要在空格上拆分,是的,这个答案是错误的,他忘记了很多东西sthx,但是他的字符串中没有逗号,你应该在空格上拆分,因为一个有2个空格,所以应该ld be
    .split()[3]。split()[0]
    哦,对不起,我忘记换衣服了it@Vaghinak这也不起作用。我得到了错误消息:“list”对象没有属性“replace”@Mataunited17,因为你需要在空格上拆分,是的,这个答案是错误的,他忘记了很多东西。Regex不应该是最好的解决方案,但这很好,因此,为此我得到了错误消息:“DataFra”me'对象没有
    df['NAME']的属性'str'。str.extract(r'\s{2,}(\d+(?:\s\d+*)))。str.replace('\s+','')
    @Mataunited17我使用了您的问题中的数据,它在我的Python 3.6中工作。我明白了。我使用的是3.7.1。奇怪。@Mataunited17添加了
    expand=False
    ,因此
    extract
    只返回了系列并在Python 3.7中测试。同样适用于Python 3.6。regex不应该是最好的解决方案,但它工作得很好,因此,我得到了这个结果错误消息:“DataFrame”对象没有
    df['NAME']的属性'str'