Estoy tratando de reemplazar todas las letras de un objeto python con números, en un Pandas DataFrame.

Ejemplo: tengo una columna de 3000 códigos de curso, ej. A0101P. Estoy tratando de reemplazar todas las letras del alfabeto en el código del curso con los números correspondientes (A = 1, B = 2, etc.) para que la salida se vea así "1010116" (y lo más importante, es un entero, no un objeto / cadena )

El código del curso fue inicialmente un objeto python. Entonces he usado

course.to_string()

Para cambiarlo al valor de cadena.

Luego, creé un mapeo y luego usé str.replace para reemplazar los valores.

mapping = {"A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10, "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q":17,"R":18, "S": 19, "T": 20,"U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z":26}

courseDone = course.str.replace(course["Cursus code"], mapping)

Plantea un error

AttributeError: 'str' object has no attribute 'str'

También he intentado

for key, value in mapping.items():
    course = course.replace(key, value)

Y plantea error

TypeError: replace() argument 2 must be str, not int

Aunque el tipo de datos es una cadena.

Datos de ejemplo:

1       A0101P
2       A0111P
3       A0200P
4       A0201P
5       A0202P

Salida deseada:

1       1010116
2       1011116
3       1020016
4       1020116
5       1020216

También he tratado de cambiar el tipo de datos con str () y los errores finales son los mismos.

Cuando uso

for key, value in mapping.items():
    course["Cursus code"] = course["Cursus code"].replace(key, value)

No recibo ningún error, pero el resultado sigue siendo el mismo.

Soy nuevo en Python y he hecho todo lo posible para encontrar una solución, pero nada parece funcionar. ¿Alguien puede ayudarme por favor?

3
Zuzanna Glogowska 2 oct. 2019 a las 16:35

4 respuestas

La mejor respuesta

Una solución tonta es reemplazar las letras una por una, similar a la suya, pero tiene que asignar números a una cadena:

for k,v in mapping.items():
    v = str(v)
    course["Cursus code"] = course["Cursus code"].str.replace(k,v)

Salida:

0    1010116
1    1011116
2    1020016
3    1020116
4    1020216
1
Quang Hoang 2 oct. 2019 a las 14:09

También puede usar map para reemplazar valores con un dict, está bastante limpio. Entonces, sobre su problema de cadena, ¿es porque no asignó su resultado?

Me gusta : course = course.to_string () courseDone = course.str.replace (curso ["Cursus code"], mapeo)

O

courseDone = course.to_string().str.replace(course["Cursus code"], mapping)

0
Gwendal Yviquel 2 oct. 2019 a las 13:43

Las cadenas se mantienen como 'objetos' en los pandas. Puede usar el método info () de un marco de datos para ver qué columnas son enteras, objetos (para cadenas), marcas de tiempo, etc., como:

df.info()

En cuanto a su pregunta, puede usar el método de aplicación y reemplazar su cadena con la asignación deseada, así:

def str_to_int_map(string, mapping):

   return int(''.join([str(mapping.get(x, x)) for x in string]))
mapping = {"A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10, "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q":17,"R":18, "S": 19, "T": 20,"U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z":26}
df['Course'] = df['Course'].apply(lambda x: str_to_int_map(x, mapping))
1
Burak Onal 2 oct. 2019 a las 13:57

El siguiente ejemplo es como su estructura actual. Pero hay muchas maneras de hacer esto. Expanda la asignación como mejor le parezca. Y también tenga en cuenta que iterar a través de un dict es diferente en Python 2/3. Observe que tanto la clave como el valor son cadenas en el dict.

string_to_change = 'abc123'
mapping_dict = dict(zip(['a','b','c'],['1','2','3']))
for k, v in mapping_dict.iteritems():
    string_to_change = string_to_change.replace(k,v)
'''
0
Chris McL 2 oct. 2019 a las 13:46
58202686