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