我有一个名为'Raw'的pandas df列格式不一致。它包含的字符串如下所示:
'(1T XXX, Europe)'
'(2T YYYY, Latin America)'
'(3T ZZ/ZZZZ, Europe)'
'(4T XXX XXX, Africa)'
'Raw'中字符串中唯一一致的是它们以数字开头,中间包含逗号后跟空格,并且它们也包含括号。
现在,我想在我的数据框中创建两个额外的列(模型和区域):
如何使用正则表达式执行此操作?
答案 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)
试试这个:\(([^,]*), ([^)]*)\)
答案 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)
将 str.extract
与 regex
一起使用。
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
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