J'ai un DataFrame et je souhaite remplacer les valeurs d'une colonne particulière qui dépassent une valeur par zéro. J'avais pensé que c'était un moyen d'y parvenir:
df[df.my_channel > 20000].my_channel = 0
Si je copie le canal dans une nouvelle trame de données, c'est simple:
df2 = df.my_channel
df2[df2 > 20000] = 0
Cela fait exactement ce que je veux, mais semble ne pas fonctionner avec le canal dans le cadre du DataFrame original.
Réponses:
.ix
l'indexeur fonctionne bien pour la version pandas antérieure à 0.20.0, mais depuis pandas 0.20.0, l'.ix
indexeur est obsolète , vous devez donc éviter de l'utiliser. Au lieu de cela, vous pouvez utiliser.loc
ou desiloc
indexeurs. Vous pouvez résoudre ce problème en:Ou, en une seule ligne,
mask
vous aide à sélectionner les lignes dans lesquellesdf.my_channel > 20000
estTrue
, tandis quedf.loc[mask, column_name] = 0
définit la valeur 0 pour les lignes sélectionnées où se trouvemask
dans la colonne dont le nom estcolumn_name
.Mise à jour: dans ce cas, vous devez utiliser
loc
car si vous utiliseziloc
, vous obtiendrez un messageNotImplementedError
vous indiquant que l' indexation booléenne basée sur iLocation sur un type entier n'est pas disponible .la source
Essayer
Remarque: depuis la v0.20.0,
ix
est obsolète au profit deloc
/iloc
.la source
np.where
La fonction fonctionne comme suit:Dans votre cas, vous voudriez:
la source
La raison pour laquelle votre dataframe d'origine ne se met pas à jour est que l' indexation chaînée peut vous amener à modifier une copie plutôt qu'une vue de votre dataframe. La documentation donne ce conseil:
Vous avez quelques alternatives: -
loc
+ Indexation booléenneloc
peut être utilisé pour définir des valeurs et prend en charge les masques booléens:mask
+ Indexation booléenneVous pouvez attribuer à votre série:
Ou vous pouvez mettre à jour votre série sur place:
np.where
+ Indexation booléenneVous pouvez utiliser NumPy en attribuant votre série d'origine lorsque votre condition n'est pas satisfaite; cependant, les deux premières solutions sont plus propres car elles ne modifient explicitement que les valeurs spécifiées.
la source
J'utiliserais la
lambda
fonction surSeries
unDataFrame
comme ceci:Je ne prétends pas que ce soit un moyen efficace, mais cela fonctionne bien.
la source
loc
ici, commedf.loc[: , 'my_column'] = df['my_column'].map(f)
. Je ne sais pas si c'est rapide comme ceux que vous avez ajoutés ci-dessous.Essaye ça:
df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)
ou
df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)
la source