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

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
)

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


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)


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'])

1
Ounp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.