2017-07-05 571 views
0

我有一个名为'Raw'的熊猫df列,其格式不一致。该字符串包含看起来像:Python使用正则表达式提取pandas列中字符串的部分

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

在“原始”的字符串相一致的唯一的事情是,他们以数字开头,包括中间+空格逗号,它们包含圆括号好。现在

,我想在我的数据帧创建两个额外列(型号和地区):

  • “模式”将包含字符串的开始,即第一个括号和逗号之间的一切
  • “区”将包含字符串的结尾,即逗号后的空格,最后括号

我怎么做,使用正则表达式之间的一切吗?

回答

2

由于只有一个逗号,一切都是括号之间,在你的情况下,使用.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] 
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

如果逗号是字符串部分的可靠分隔符,则不需要regexp。如果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) 
相关问题