Supposons que j'ai un pandas DataFrame avec deux colonnes, A et B. Je voudrais modifier ce DataFrame (ou créer une copie) afin que B soit toujours NaN chaque fois que A est 0. Comment pourrais-je y parvenir?
J'ai essayé ce qui suit
df['A'==0]['B'] = np.nan
et
df['A'==0]['B'].values.fill(np.nan)
sans succès.
where
comme indiqué dans cette solution ciRéponses:
Utilisation
.loc
pour l'indexation basée sur les étiquettes:L'
df.A==0
expression crée une série booléenne qui indexe les lignes,'B'
sélectionne la colonne. Vous pouvez également l'utiliser pour transformer un sous-ensemble d'une colonne, par exemple:Je n'en sais pas assez sur les composants internes de pandas pour savoir exactement pourquoi cela fonctionne, mais le problème de base est que parfois l'indexation dans un DataFrame renvoie une copie du résultat, et parfois il renvoie une vue sur l'objet d'origine. Selon la documentation ici , ce comportement dépend du comportement numpy sous-jacent. J'ai trouvé que tout accéder en une seule opération (plutôt que [un] [deux]) est plus susceptible de fonctionner pour le réglage.
la source
Voici des documents pandas sur l'indexation avancée:
La section vous expliquera exactement ce dont vous avez besoin! Il s'avère que
df.loc
(comme .ix est obsolète - comme beaucoup l'ont souligné ci-dessous) peut être utilisé pour le découpage / découpage en dés d'une dataframe. Et. Il peut également être utilisé pour définir les choses.La réponse de Bren est donc: `` trouvez-moi tous les endroits où
df.A == 0
, sélectionnez la colonneB
et réglez-la surnp.nan
''la source
loc[selection criteria, columns I want]
À partir de pandas 0.20 ix est obsolète . La bonne façon est d'utiliser df.loc
voici un exemple de travail
Explication:
Comme expliqué dans le document ici ,
.loc
est principalement basé sur les étiquettes, mais peut également être utilisé avec un tableau booléen .Donc, ce que nous faisons ci-dessus est d'appliquer
df.loc[row_index, column_index]
en:loc
peut prendre un tableau booléen comme masque qui indique aux pandas dans quel sous-ensemble de lignes nous voulons changerrow_index
loc
est également basée sur l'étiquette pour sélectionner la colonne en utilisant l'étiquette'B'
dans lecolumn_index
Nous pouvons utiliser la logique, la condition ou toute opération qui retourne une série de booléens pour construire le tableau de booléens. Dans l'exemple ci-dessus, nous voulons tout ce
rows
qui contient un0
, pour cela, nous pouvons utiliserdf.A == 0
, comme vous pouvez le voir dans l'exemple ci-dessous, cela renvoie une série de booléens.Ensuite, nous utilisons le tableau de booléens ci-dessus pour sélectionner et modifier les lignes nécessaires:
Pour plus d'informations, consultez la documentation sur l'indexation avancée ici .
la source
Pour une augmentation massive de la vitesse, utilisez la fonction where de NumPy.
Installer
Créez un DataFrame à deux colonnes avec 100 000 lignes avec quelques zéros.
Solution rapide avec
numpy.where
Timings
Numpy
where
est environ 4x plus rapidela source
.values
dansnp.where(df.a.values == 0, np.nan, df.b.values)
? On dirait que çanp.where(df.a == 0, np.nan, df.b)
marche aussi?Pour remplacer plusieurs colonnes, convertissez-vous en tableau numpy en utilisant
.values
:la source