Come riempire il valore mancante in base ad altre colonne nel frame di dati Pandas?


19

Supponiamo di avere un frame di dati 5 * 3 in cui la terza colonna contiene un valore mancante

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

Spero di generare valore per la regola basata sul valore mancante nella prima colonna del primo prodotto

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

Come posso utilizzare il frame di dati? Grazie.

Come aggiungere la condizione per calcolare il valore mancante come questo?

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

Non puoi farlo perché le dimensioni non saranno uguali
Mayur Dangar,

Puoi espandere la tua risposta? Perché non è possibile e cosa potrebbe eventualmente fare per risolvere il problema?
Damian Melniczuk,

ehi, anche io ho la stessa domanda. ma cosa succede se i dati di cui mi occupo sono testuali? questa è la condizione è "se" ingredienti "contiene pollo, allora" tipo "= non veg"
user7389747

Risposte:


17

Ipotizzando tre colonne della dataframe è a, be c. Questo è quello che vuoi:

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

Codice 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
)

Qualche anno in ritardo, ma funziona solo quando le colonne sono numeriche. np.isnannon supporta dati non numerici. Non è un problema qui poiché l'OP aveva colonne numeriche e operazioni aritmetiche, ma per il resto pd.isnullè un'alternativa migliore.
Adarsh ​​Chavakula,

3

Un'altra opzione:

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


3

Che dire dell'utilizzo del fillna()metodo del frame di dati?

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


2

Supponendo che le tre colonne della dataframe sono a, be c. Quindi è possibile eseguire l'operazione richiesta in questo modo:

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

1
Oppurenp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.