Python 使用正则表达式从以某些字符开头的列中删除子字符串
我有一个由名字和身份证号码组成的专栏,比如Python 使用正则表达式从以某些字符开头的列中删除子字符串,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个由名字和身份证号码组成的专栏,比如 Name 1 Name 2 Name 3 CAP 1 TRE001 CAP 2 TRE002 PB 1 EHS001 ... ID号始终以TRE或EHS开头。我想从列中删除这些内容,以便列 Name 1 Name 2 Name 3 CAP 1 CAP 2 PB 2 ... 我知道我可以用str.replace替换一些正则表达式,用“”替换。(可能也可以使用str.strip?)。但我似乎不太懂正则表达式 编辑:我应该更详细一点——有时候
Name 1
Name 2
Name 3
CAP 1 TRE001
CAP 2 TRE002
PB 1 EHS001
...
ID号始终以TRE或EHS开头。我想从列中删除这些内容,以便列
Name 1
Name 2
Name 3
CAP 1
CAP 2
PB 2
...
我知道我可以用str.replace替换一些正则表达式,用“”替换。(可能也可以使用str.strip?)。但我似乎不太懂正则表达式
编辑:我应该更详细一点——有时候名字可能是
Name 1 Low
Name 2 Low
Name 3
Name 4
CAP 1 TRE001
etc
这就是为什么如果我使用str.split,我有时会删除一部分我不想要的名字我们使用str.split
df['col']=df.col.str.split(' ',n=2).str[:2].str.join(sep=' ')
或者我们使用str.rsplit
df.col.str.rsplit(' ',n=1).str[0]
使用特定的正则表达式模式:
In [17]: df.col.str.replace(r'\s*\b(TRE|EHS).*$', '')
Out[17]:
0 Name 1
1 Name 2
2 Name 3
3 CAP 1
4 CAP 2
5 PB 1
Name: col, dtype: object
尝试在拆分时使用简单的“或”正则表达式模式。 接下来,只选择返回的第一个元素,它应该类似于:
series.str.split('TRE|EHS').str[0]
让我们看一个单词的例子:
text = 'CAP 1 TRE001'
' '.join(text.split(' ')[0:2])
您将获得:
# output: 'CAP 1'
现在,我们对包含列名的列表应用相同的代码:
col_names = ['CAP 1 TRE001', 'CAP 2 TRE002', 'PB 1 EHS001']
[' '.join(col.split(' ')[0:2])for col in col_names]
并给出:
# output: ['CAP 1', 'CAP 2', 'PB 1']
Names
0 CAP 1
1 CAP 2
2 PB 1
或者,如果您有这样一个数据帧:
df = pd.DataFrame(['CAP 1 TRE001', 'CAP 2 TRE002', 'PB 1 EHS001'], columns=['Names'])
你必须这样做:
df['Names'] = df['Names'].apply(lambda s: ' '.join(s.split(' ')[0:2]))
并给出:
# output: ['CAP 1', 'CAP 2', 'PB 1']
Names
0 CAP 1
1 CAP 2
2 PB 1