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'