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

时间:2017-07-05 09:29:57

标签: python regex string pandas

我有一个名为'Raw'的pandas df列格式不一致。它包含的字符串如下所示:

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

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

现在,我想在我的数据框中创建两个额外的列(模型和区域):

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

如何使用正则表达式执行此操作?

7 个答案:

答案 0 :(得分:3)

由于只有一个逗号,并且所有内容都在括号之间,在您的情况下,请在切片后使用.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 :(得分:1)

试试这个:\(([^,]*), ([^)]*)\)

请参阅:https://regex101.com/r/fCetWg/1

答案 2 :(得分:0)

maxdiff

答案 3 :(得分:0)

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

第一个正则表达式检查开括号&#34;(&#34;在模型前面和关闭&​​#34;,&#34;。第二个正则表达式检查&#34;&之间的任何字符串;& #34;和&#34;)&#34;。

答案 4 :(得分: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)

答案 5 :(得分:0)

如果逗号是字符串部分的可靠分隔符,则不需要regexp。如果df是您的数据帧:

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

如果你想使用regexp,那就像是:

s = '(1T XXX, Europe)'
m = re.match('\(([\w\s]+),([\w\s]+)\)', s)
model = m.group(1)
region = m.group(2)

答案 6 :(得分: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:

str.replace() + str.split()rename

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