Comment remplir la valeur manquante basée sur d'autres colonnes dans la trame de données Pandas?

19

Supposons que j'ai une trame de données 5 * 3 dans laquelle la troisième colonne contient une valeur manquante

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

J'espère générer de la valeur pour la règle basée sur la valeur manquante que le premier produit deuxième colonne

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

Comment puis-je utiliser la trame de données? Merci.

Comment ajouter une condition pour calculer une valeur manquante comme celle-ci?

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
la source
Vous ne pouvez pas faire cela car la taille ne sera pas égale
Mayur Dangar
Pouvez-vous développer votre réponse? Pourquoi n'est-ce pas possible et que pourrait-il faire pour résoudre le problème?
Damian Melniczuk
hé même j'ai la même question. mais que se passe-t-il si les données que je traite sont textuelles? c'est-à-dire que la condition est comme "si 'les ingrédients' contiennent du poulet alors 'type' = non-veg"
user7389747

Réponses:

17

En supposant que trois colonnes de votre trame de données sont a, bet c. Voici ce que vous voulez:

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

Code complet:

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
la source
Quelques années de retard mais cela ne fonctionne que lorsque les colonnes sont numériques. np.isnanne prend pas en charge les données non numériques. Ce n'est pas un problème ici car l'OP avait des colonnes numériques et des opérations arithmétiques, mais sinon pd.isnullc'est une meilleure alternative.
Adarsh ​​Chavakula
3

Une autre option:

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

Vishal
la source
3

Qu'en est-il de l'utilisation de la fillna()méthode de la trame de données?

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

yosemite_k
la source
2

En supposant que les trois colonnes de votre trame de données sont a, bet c. Ensuite, vous pouvez effectuer l'opération requise comme ceci:

values = df['a'] * df['b']
df['c'] = values.where(df['c'] == np.nan, others=df['c'])
enterML
la source
1
Ounp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas