我有一个数据框,我想在其中加倍空格后提取内容。对于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
如何修改第二个功能以完成我想要的工作?
答案 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(' ',''))
参考:-
答案 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+).*', '')