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 None
s dans les colonnes a
et b
, mais pas c
.
Quelle est la meilleure façon de faire cela?
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
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
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
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)
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.
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