Python在pandas列中使用正则表达式提取字符串的部分

3

我有一个名为'Raw'的pandas df列,其格式不一致。它包含的字符串看起来像这样:

'(1T XXX, Europe)'
'(2T YYYY, Latin America)'
'(3T ZZ/ZZZZ, Europe)'
'(4T XXX XXX, Africa)'

'Raw'字符串中唯一的一致性是它们以数字开头,中间包含逗号和空格,并且它们也包含括号。

现在,我想在我的数据框中创建两个额外的列(Model和Region):

  • 'Model'将包含字符串的开头,即第一个括号和逗号之间的所有内容
  • 'Region'将包含字符串的结尾,即逗号后面的空格和最后一个括号之间的所有内容

如何使用正则表达式实现这一点?

7个回答

5

由于只有一个逗号,而且所有内容都在括号内,在您的情况下,应该适当切片后使用.str.split()

model_region = df.Raw.str[1:-1].str.split(', ', expand = True)

但是如果您坚持的话:
model_region = df.Raw.str.extract('\((.*), (.*)\)', expand = True)

那么

df['Model'] = model_region[0]
df['Region'] = model_region[1]

1

0
import re

s = '(3T ZZ/ZZZZ, Europe)'
m=re.search(r'\((.*), (.*)\)',s)
print(m.groups())

0
Model=re.findall(r"(?<=\().+(?=\,)",s)
Region=re.findall(r"(?<=\, ).+(?=\))",s)

第一个正则表达式检查模型前面的开括号“(”和闭逗号“,”。第二个正则表达式检查在逗号“,”和右括号“)”之间的任何字符串。

0
string_list = ['(1T XXX, Europe)',
'(2T YYYY, Latin America)',
'(3T ZZ/ZZZZ, Europe)',
'(4T XXX XXX, Africa)']
df = pd.DataFrame(string_list)
df = df[0].str.extract("\(([^,]*), ([^)]*)\)", expand=False)

0

如果逗号是您字符串部分可靠的分隔符,则您不需要正则表达式。 如果df是您的数据框:

df['Model'] = [x.split(',')[0].replace('(', '') for x in df['Raw']]
df['Region'] = [x.split(',')[1].replace(')', '') for x in df['Raw']]

如果你想使用正则表达式,它会看起来像这样:
s = '(1T XXX, Europe)'
m = re.match('\(([\w\s]+),([\w\s]+)\)', s)
model = m.group(1)
region = m.group(2)

0

你可以尝试以下方法:

示例数据框:

df
                        raw
0          (1T XXX, Europe)
1  (2T YYYY, Latin America)
2      (3T ZZ/ZZZZ, Europe)
3      (4T XXX XXX, Africa)

解决方案 1:

使用 str.extractregex

df = df.raw.str.extract(r'\((.*), (.*)\)').rename(columns={0:'Model', 1:'Region'})
print(df)
        Model         Region
0      1T XXX         Europe
1     2T YYYY  Latin America
2  3T ZZ/ZZZZ         Europe
3  4T XXX XXX         Africa

解决方案2:

使用rename函数,结合str.replace()str.split()方法。

df = df.raw.str.replace('[(|)]' , '').str.split(',', expand=True).rename(columns={0:'Model', 1:'Region'})
print(df)
        Model          Region
0      1T XXX          Europe
1     2T YYYY   Latin America
2  3T ZZ/ZZZZ          Europe
3  4T XXX XXX          Africa

注意:

然而,如果您想保留原始列,那么您可以选择以下方法:

df[['Model', 'Region' ]] = df.raw.str.replace('[(|)]' , '').str.split(',', expand=True)

print(df)
                        raw       Model          Region
0          (1T XXX, Europe)      1T XXX          Europe
1  (2T YYYY, Latin America)     2T YYYY   Latin America
2      (3T ZZ/ZZZZ, Europe)  3T ZZ/ZZZZ          Europe
3      (4T XXX XXX, Africa)  4T XXX XXX          Africa

或者

df[['Model', 'Region' ]] = df.raw.str.extract(r'\((.*), (.*)\)')
print(df)
                        raw       Model         Region
0          (1T XXX, Europe)      1T XXX         Europe
1  (2T YYYY, Latin America)     2T YYYY  Latin America
2      (3T ZZ/ZZZZ, Europe)  3T ZZ/ZZZZ         Europe
3      (4T XXX XXX, Africa)  4T XXX XXX         Africa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接