python - 正则表达式查找两个模式并提取值

标签 python pandas

嗨,我想从一列中提取一些值到另一列,但是我在正则表达式运算符方面遇到了一些困难。我想获取两个值 (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.extractBOX描述中提取所需的模式:

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/

相关文章:

python - 如何从python中带有方括号的正则表达式输出中提取内容

python - 将 pandas DataFrame 列扩展为多行

python - 将多个虚拟变量转换为一列

javascript - 如何获取两个 JSON 之间的差异?

python - 在Python中获取最长的递增子序列

python - 使用 PhantomJS 运行 Selenium Webdriver 时出现 InvalidElementStateException

python - 我怎样才能制作 pandas 版本 18.0 商店集

python - 如何在python中找到一组不同列元素的最低总和?

python - 收到意外的关键字参数 'pk'

类似于字典的Python数据结构,其中键是两个值?