web-dev-qa-db-fra.com

Pandas dataframe fillna () seulement quelques colonnes en place

J'essaye de ne remplir aucune valeur dans un Pandas dataframe avec des 0 pour seulement un sous-ensemble de colonnes.

Quand je fais:

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

Le résultat:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Il remplace chaque None par 0. Ce que je veux faire est de ne remplacer que Nones dans les colonnes a et b, mais pas c.

Quelle est la meilleure façon de faire cela?

97
Sait

Vous pouvez sélectionner les colonnes de votre choix et le faire par affectation:

df[['a', 'b']] = df[['a','b']].fillna(value=0)

Le résultat obtenu est comme prévu:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0
147
root

Vous pouvez utiliser dict, fillna avec une valeur différente pour une colonne différente

df.fillna({'a':0,'b':0})
Out[829]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

Après le rendre

df=df.fillna({'a':0,'b':0})
df
Out[831]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0
51
WeNYoBen

Vous pouvez éviter de copier l'objet en utilisant la solution de Wen et inplace = True:

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

Quels rendements:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0
12
Leesa H.

utiliser la réponse la plus élevée produit un avertissement sur les modifications à apporter à une copie d'une tranche df. En supposant que vous ayez d'autres colonnes, une meilleure façon de faire est de passer un dictionnaire:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)

3
Jonathan

Voici comment vous pouvez tout faire en une seule ligne:

df[['a', 'b']].fillna(value=0, inplace=True)

Répartition: df[['a', 'b']] sélectionne les colonnes pour lesquelles vous souhaitez renseigner les valeurs NaN, value=0 lui indique de remplir NaN avec un zéro et inplace=True rendra les modifications permanentes, sans avoir à copier le résultat. L'object.

3
Josephine M. Ho

Ou quelque chose comme:

df.loc[df['a'].isnull(),'a']=0
df.loc[df['b'].isnull(),'b']=0

et s'il y a plus:

for i in your_list:
    df.loc[df[i].isnull(),i]=0
2
U10-Forward