Esta operación aparentemente simple me parece bastante difícil. Tengo un marco de datos que tiene una columna llamada CompanyId. Sus valores son 'COMP23', 'COMP55', etc. Ahora, cuando quiero eliminar el prefijo 'COMP' y hacerlo numérico, me gana. Esto es lo que estoy haciendo:

df['companyId'] = df['companyId'].astype('str') # because type was 'object'.

df['companyId'].map(lambda x: int(x[4:]))

Donde me equivoco Noté que el df era un objeto en serie.

0
user1717931 10 may. 2016 a las 01:45

3 respuestas

La mejor respuesta

Tratar:

df['companyId'] = df['companyId'].map(lambda x: int(str(x)[4:]))
2
piRSquared 9 may. 2016 a las 22:50

Puede usar un patrón regex para extraer todos los dígitos (\d+).

>>> df.CompanyId.str.extract(r'(\d+)')
0    23
1    55
Name: CompanyId, dtype: object

Tenga en cuenta que su método original funciona bien.

>>> df['CompanyId'].astype('str').map(lambda x: int(x[4:]))
0    23
1    55
Name: CompanyId, dtype: int64

Si hay un error, quizás sea porque hay un problema con los datos.

df =  pd.DataFrame({'CompanyId': ['COMP23', 'COMP55', 'COMP', '', 'COM55']})    
df['CompanyId'].astype('str').map(lambda x: int(x[4:]))

ValueError: literal no válido para int() con base 10: ''

Tenga en cuenta que el patrón regex todavía extrae los valores correctos:

>>> df.CompanyId.str.extract(r'(\d+)')
0     23
1     55
2    NaN
3    NaN
4     55  
0
Alexander 9 may. 2016 a las 22:59

Prueba esto:

In [210]: df['companyId'].str.replace('COMP','').astype(int)
Out[210]:
0     23
1     55
2    101
Name: companyId, dtype: int32

O

In [207]: df.companyId.str[4:].astype(int)
Out[207]:
0     23
1     55
2    101
Name: companyId, dtype: int32
0
MaxU 9 may. 2016 a las 22:55