¿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
KyL
fuente
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
)
Icyblade
fuente
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

Vishal
fuente
3

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

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

yosemite_k
fuente
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'])
enterML
fuente
1
Onp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas