¿Cómo llenar el valor faltante basado en otras columnas en el marco de datos de Pandas?


19

Supongamos que tengo un marco de datos de 5 * 3 en el que la tercera columna contiene un valor perdido

1 2 3
4 5 NaN
7 8 9
3 2 NaN
5 6 NaN

Espero generar valor para la regla basada en el valor perdido que el primer producto segunda columna

1 2 3
4 5 20 <--4*5
7 8 9
3 2 6 <-- 3*2
5 6 30 <-- 5*6

¿Cómo puedo usar el marco de datos? Gracias.

¿Cómo agregar una condición para calcular el valor perdido como este?

if 1st % 2 == 0 then 3rd = 1st * 2nd else 3rd = 1st + 2nd

1 2 3
4 5 20 <-- 4*5 because 4%2==0
7 8 9
3 2 5 <-- 3+2 because 3%2==1
5 6 11 <-- 5+6 because 5%2==1

No puedes hacer esto porque el tamaño no será igual
Mayur Dangar

¿Puedes ampliar tu respuesta? ¿Por qué no es posible y qué podría hacer para resolver el problema?
Damian Melniczuk

hey, incluso yo tengo la misma pregunta. pero ¿qué pasa si los datos con los que trato son textuales? esa es la condición es como "si 'ingredientes' contienen pollo, entonces 'tipo' = no vegetariano"
usuario7389747

Respuestas:


17

Suponiendo que tres columnas de su marco de datos es a, by c. Esto es lo que quieres:

df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)

Código completo:

df = pd.DataFrame(
    np.array([[1, 2, 3], [4, 5, np.nan], [7, 8, 9], [3, 2, np.nan], [5, 6, np.nan]]), 
    columns=['a', 'b', 'c']
)
df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)

Unos años de retraso, pero esto solo funciona cuando las columnas son numéricas. np.isnanno admite datos no numéricos. No es un problema aquí ya que el OP tenía columnas numéricas y operaciones aritméticas, pero de lo contrario pd.isnulles una mejor alternativa.
Adarsh ​​Chavakula

3

Otra opción:

df.loc[(pd.isnull(df.C)), 'C'] = df.A * df.B


3

¿Qué pasa con el uso fillna()del marco de datos?

df['C'].fillna(df.A * df.B)


2

Suponiendo que las tres columnas en su marco de datos son a, by c. Entonces puede hacer la operación requerida de esta manera:

values = df['a'] * df['b']
df['c'] = values.where(df['c'] == np.nan, others=df['c'])

1
Onp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.