使用正则表达式在双倍空格后提取整数

时间:2019-03-15 07:45:11

标签: 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 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

如何修改第二个功能以完成我想要的工作?

5 个答案:

答案 0 :(得分:4)

按照您可能会使用的原始逻辑

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+)*)用于提取2个或更多空格后第一次出现的由空格分隔的连续数字块,然后.replace(r'\s+', '')删除此提取的文本中的所有空格
  • .replace(r'\s{2,}\d+(?:\s\d+)*\s+stocks'更新NAME列中的文本,它删除2个或多个空格,连续的空格分隔的数字块,然后删除1个以上的空格和stocks。实际上,如果还有其他话,最后一个\s+stocks可以替换为.*

答案 1 :(得分:3)

另一种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', ''))

将这些列分配回原始DataFrame

df[['NAME', 'STOCKS']] = df_split[['NAME', 'STOCKS']]

         COMPANY_NAME    STOCKS  PERCENT
0     APPLE COMPANY A  57638232  0.12322
1  BANANA 1 COMPANY B  12946201  0.02768
2    ORANGE COMPANY C   8354229  0.01786

答案 2 :(得分:1)

您可以使用后视和前瞻运算符。

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

这会捕获两个空格之间的所有字符和单词stock ,并将所有空格替换为空。

使用Split的另一种解决方案

df["NAME"].apply(lambda x:x[x.find('  ')+2:x.find('stocks')-1].replace(' ',''))

参考:-

  1. Look_behind

答案 3 :(得分:0)

您可以尝试

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

答案 4 :(得分:0)

这可以在不使用正则表达式的情况下通过split来完成。

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