¿cómo estás? Soy bastante nuevo en el código y tengo esta pregunta:

Quiero iterar a través de una columna, y quiero cambiar los valores de esta columna según una condición, en este caso, quiero cambiar el valor de la columna 'a1': si el valor contiene la palabra 'Juancito', quiero cambiar solo a 'Juancito'. El ciclo for funciona bien, pero el valor no cambia al final.

¿Qué estoy haciendo mal?

import pandas as pd
inp = [{'a1':'Juancito 1'}, {'a1':'Juancito 2'}, {'a1':'Juancito 3'}]
df = pd.DataFrame(inp)

for i in df['a1']:
    if 'Juancito' in i:
        i = 'Juancito'
    else:
        pass
df.head()
3
Lucio Stortoni Ruiz 22 ene. 2021 a las 20:12

4 respuestas

La mejor respuesta

No necesitas un bucle for.

Simplemente use numpy.where con Series.str.contains:

In [83]: import numpy as np

In [84]: df['a1'] = np.where(df['a1'].str.contains('Juancito'), 'Juancito', df['a1'])

In [85]: df
Out[85]: 
         a1
0  Juancito
1  Juancito
2  Juancito
1
Mayank Porwal 22 ene. 2021 a las 17:30

Prueba esto:

import pandas as pd
inp = [{'a1':'Juancito 1'}, {'a1':'Juancito 2'}, {'a1':'Juancito 3'}]
df = pd.DataFrame(inp)

for i in range(df["a1"].shape[0]):
    print(i)
    if 'Juancito' in df["a1"][i]:
        df["a1"][i] = 'Juancito'
    else:
        pass
df.head()
1
dimay 22 ene. 2021 a las 17:19

No está configurando el valor del elemento de marco de datos en su código. Simplemente lo está asignando temporalmente a i. Un enfoque sería usar la indexación numérica donde el número de fila cambiará con i y el número de columna será el que desea procesar.

Ejemplo:

import pandas as pd
inp = [{'a1':'Juancito 1'}, {'a1':'Juancito 2'}, {'a1':'Juancito 3'}]
df = pd.DataFrame(inp)

for i in range(len(df)):
    if 'Juancito' in df.iloc[i][0]:
        df.iloc[i][0] = 'Juancito'
    else:
        pass
df.head()
1
ahmadjanan 22 ene. 2021 a las 17:21

Como se menciona en el comentario, incorporó los cambios

import pandas as pd
inp = [{'a1':'Juancito 1'}, {'a1':'Juancito 2'}, {'a1':'Juancito 3'}]
df = pd.DataFrame(inp)

for index, i in enumerate(df['a1'])::
    if 'Juancito' == i:
        df['a1'].loc[index] = 'Juancito'
    else:
        pass
df.head()
1
Epsi95 22 ene. 2021 a las 17:24
65849706