Tengo una columna que es una mezcla de nombres y números de identificación como

Name 1
Name 2
Name 3 
CAP 1 TRE001 
CAP 2 TRE002 
PB 1  EHS001 
...

Los números de identificación siempre comienzan con TRE o EHS. Quiero eliminarlos de la columna para que la columna esté

Name 1
Name 2
Name 3 
CAP 1
CAP 2
PB 2
...

Sé que puedo usar str.replace con alguna expresión regex y reemplazar con "". (¿Probablemente también pueda usar str.strip?). Pero parece que no entiendo muy bien la expresión regular.

Editar: debería haber sido más detallado, a veces los nombres pueden ser como

Name 1 Low
Name 2 Low 
Name 3 
Name 4
CAP 1 TRE001
etc 

Por eso, si uso str.split, a veces cortaré una parte de los nombres que no quiero

1
Gingerhaze 3 oct. 2019 a las 17:06

4 respuestas

La mejor respuesta

Con un patrón de expresiones regulares específico:

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
1
RomanPerekhrest 3 oct. 2019 a las 14:12

Nosotras usando str.split

df['col']=df.col.str.split(' ',n=2).str[:2].str.join(sep=' ')

O nosotras usando str.rsplit

df.col.str.rsplit(' ',n=1).str[0]
0
YOBEN_S 3 oct. 2019 a las 14:09

Veamos un ejemplo en una sola palabra:

text = 'CAP 1 TRE001'
' '.join(text.split(' ')[0:2])

Y obtendrás:

# output: 'CAP 1'

Ahora aplicamos el mismo código a la lista que contiene los nombres de columna:

col_names = ['CAP 1 TRE001', 'CAP 2 TRE002', 'PB 1  EHS001']
[' '.join(col.split(' ')[0:2])for col in col_names]

Y da:

# output: ['CAP 1', 'CAP 2', 'PB 1']

O si tiene un marco de datos de pandas como este:

df = pd.DataFrame(['CAP 1 TRE001', 'CAP 2 TRE002', 'PB 1  EHS001'], columns=['Names'])

Tienes que hacer esto:

df['Names'] = df['Names'].apply(lambda s: ' '.join(s.split(' ')[0:2]))

Y da:

   Names
0  CAP 1
1  CAP 2
2   PB 1
0
Massifox 3 oct. 2019 a las 14:31

Intente usar un patrón simple 'o' regex en la división. A continuación, elija solo el primer elemento devuelto, debería verse así:

series.str.split('TRE|EHS').str[0]
0
Hadas Arik 3 oct. 2019 a las 14:19
58220907