嗨,我想从一列中提取一些值到另一列,但是我在正则表达式运算符方面遇到了一些困难。我想获取两个值 (61-150) 和 (1,1-800 GQ) 并将它们提取到名为“BOXES”的新列中。但是,我不太了解正则表达式,我似乎只能获取所有数字值。我怎样才能得到它,以便将两个值(61-150)和(1,1-800 GQ)转到框列和框描述,然后将值更改为不包含这些数字。
df = pd.read_csv('boxstore.csv')
df['BOXES'] = None
# Defining indexes for desired columns
index_description = df.columns.get_loc('BOX DESCRIPTION')
index_boxing = df.columns.get_loc('BOXES')
# Creating a pattern to be extracted
boxing_pattern = r'\((\d+-\d+)\)'
# For loop to iterate through rows to find and extract pattern to 'Seating' column
for row in range(0, len(df)):
store = re.findall(boxing_pattern, df.iat[row, index_description])
df.iat[row, index_boxing] = store
df.loc[df['BOX DESCRIPTION'] == 'BOXES (1-1,800 GQ) NEW STORE','BOX DESCRIPTION'] = 'BOXES NEW STORE'
df.loc[df['BOX DESCRIPTION'] == 'BOXES (1-1,999 SF) NEW STORE','BOXES'] = '(1-1,800 GQ)'
df.loc[df['BOX DESCRIPTION'] == 'BOXES (61-150) OLD STORE','BOX DESCRIPTION'] = 'BOXES OLD
STORE'
print(df.head(265))
我只是想提取以下内容: 箱子(1-1,999 SF)低风险 方框(61-150)低风险
# sample dataframe
BOX DESCRIPTION
0 NEW STORE
1 BOXES STORE (1-1,999 SF) LOW RISK
2 BOXES (61-150) HIGH RISK
3 BOXES (0-30) MODERATE RISK
4 BOXES (151 + ) HIGH RISK
5 BOXES (151 + ) LOW RISK
6 BOXES (151 + ) MODERATE RISK
7 BOXES (31-60) LOW RISK
8 BOXES (0-30) HIGH RISK
9 BOXES (31-60) HIGH RISK
10 BOXES (0-30) LOW RISK
11 BOXES (2,000+ SF) MODERATE RISK
12 BOXES (2,000+ SF) LOW RISK
13 BOXES (2,000+ SF) HIGH RISK
14 BOXES STORE (1-1,999 SF) MODERATE
15 BOXES STORE (1-1,999 SF) HIGH RISK
16 BOXES (61-150) LOW RISK
17 BOXES (61-150) MODERATE RISK
18 BOXES (31-60) MODERATE RISK
EXPECTED OUT
BOX DESCRIPTION
0 NEW STORE BOXES
1 BOXES STORE LOW RISK (1,1-999 SF)
2 BOXES LOW RISK (61 - 150)
3 BOXES (0-30) MODERATE RISK
4 BOXES (151 + ) HIGH RISK
5 BOXES (151 + ) LOW RISK
6 BOXES (151 + ) MODERATE RISK
7 BOXES (31-60) LOW RISK
最佳答案
您可以使用str.extract
从BOX描述
中提取所需的模式:
p = r'\s*(\(61-150\)|\(1-1,999 SF\))\s*'
s = df['BOX DESCRIPTION'].str.extract(fr'(.*?){p}(.*)')
df['BOXES'], df['BOX DESCRIPTION'] = s[1], (s[0] + ' ' + s[2]).fillna(df['BOX DESCRIPTION'])
或者,您可以首先从BOX说明
中提取所需的模式,然后将其分配给BOXES
,然后替换
该模式并将结果分配回盒子描述
:
p = r'\s*(\(61-150\)|\(1-1,999 SF\))\s*'
df['BOXES'] = df['BOX DESCRIPTION'].str.extract(p, expand=False)
df['BOX DESCRIPTION'] = df['BOX DESCRIPTION'].str.replace(p, ' ')
结果:
BOX DESCRIPTION BOXES
0 NEW STORE NaN
1 BOXES STORE LOW RISK (1-1,999 SF)
2 BOXES HIGH RISK (61-150)
3 BOXES (0-30) MODERATE RISK NaN
4 BOXES (151 + ) HIGH RISK NaN
关于python - 正则表达式查找两个模式并提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65610592/