Pandas DataFrame: remplace toutes les valeurs d'une colonne, en fonction de la condition

132

J'ai un DataFrame simple comme le suivant:

Pandas DataFrame

Je veux sélectionner toutes les valeurs de la colonne «Première saison» et remplacer celles qui sont supérieures à 1990 par 1. Dans cet exemple, seuls les Ravens de Baltimore auraient le 1996 remplacé par 1 (en gardant le reste des données intactes).

J'ai utilisé ce qui suit:

df.loc[(df['First Season'] > 1990)] = 1

Mais, il remplace toutes les valeurs de cette ligne par 1, et pas seulement les valeurs de la colonne «Première saison».

Comment puis-je remplacer uniquement les valeurs de cette colonne?

ichimok
la source

Réponses:

226

Vous devez sélectionner cette colonne:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

La syntaxe ici est donc:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Vous pouvez consulter les documents et aussi les 10 minutes aux pandas qui montrent la sémantique

ÉDITER

Si vous souhaitez générer un indicateur booléen, vous pouvez simplement utiliser la condition booléenne pour générer une série booléenne et transtyper le dtype en intcela convertira Trueet Falseen 1et 0respectivement:

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003
EdChum
la source
40

Un peu tard à la fête mais quand même - je préfère utiliser numpy où:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])
Amir F
la source
2
Je cherchais une solution pour écraser les valeurs de colonne de manière conditionnelle, mais basée sur la valeur d'une autre colonne, comme celle-ci: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) C'était la solution.
user582175
J'essaie de faire cela pour plusieurs conditions comme celle-ci, mais je continue de le faire ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Ce que j'essaie de faire, c'est essentiellement df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. Quelqu'un a-t-il une idée là-dessus?
M.Schalk le
6
df['First Season'].loc[(df['First Season'] > 1990)] = 1

étrange que personne n'ait cette réponse, la seule partie manquante de votre code est la ['première saison'] juste après df et supprimez simplement vos accolades à l'intérieur.

Odz
la source
Cela donne un 'SettingWithCopyWarning:' Il est préférable d'utiliser .loc pour tout, comme dans la réponse d'EdChum.
ambitiousdonut
2

pour une seule condition, ie. ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

utilisez ceci:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

donc la syntaxe ici est:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Pour plusieurs conditions ie. (df['employrate'] <=55) & (df['employrate'] > 50)

utilisez ceci:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

donc la syntaxe ici est:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])
Harshit Jain
la source
0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Explication:

df.locprend deux arguments, «index de ligne» et «index de colonne». Nous vérifions si la valeur est supérieure à 27 de chaque valeur de ligne, sous la colonne «Première saison», puis nous la remplaçons par 1.

Abdullah shafi
la source