J'essaie de ne remplir aucune valeur dans un dataframe Pandas 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, c'est ne remplacer que les None
s dans les colonnes a
et b
, mais pas c
.
Quelle est la meilleure façon de procéder?
df[['a', 'b']] = df[['a','b']].fillna(value=0)
fonctionnera toujoursinplace
toujours sur une copie. Je ne sais pas si c'est le casfillna
ou non. Voir cette réponse de l'un des principaux développeurs de pandas.Vous pouvez utiliser
dict
,fillna
avec une valeur différente pour une colonne différenteAprès l'avoir réattribué
la source
fromkeys
si vous le souhaitez, +1df.fillna({'a':0,'b':0}, inplace=True)
Vous pouvez éviter de faire une copie de l'objet en utilisant la solution de Wen et inplace = True:
Ce qui donne:
la source
Voici comment vous pouvez tout faire en une seule ligne:
Ventilation:
df[['a', 'b']]
sélectionne les colonnesvalue=0
pour lesquelles vous voulez remplir les valeurs NaN, lui dit de remplir NaNs avec zéro etinplace=True
rendra les modifications permanentes, sans avoir à faire une copie de l'objet.la source
l'utilisation de la réponse du haut produit un avertissement concernant la modification d'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)
la source
Ou quelque chose comme:
et s'il y en a plus:
la source
Parfois, cette syntaxe ne fonctionnera pas:
Utilisez plutôt ce qui suit:
la source