Si vous n'avez que deux choix:
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
Par exemple,
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
print(df)
les rendements
Set Type color
0 Z A green
1 Z B green
2 X B red
3 Y C red
Si vous avez plus de deux conditions, utiliseznp.select
. Par exemple, si vous voulez color
être
yellow
quand (df['Set'] == 'Z') & (df['Type'] == 'A')
- sinon
blue
quand(df['Set'] == 'Z') & (df['Type'] == 'B')
- sinon
purple
quand(df['Type'] == 'B')
- sinon
black
,
puis utilisez
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
conditions = [
(df['Set'] == 'Z') & (df['Type'] == 'A'),
(df['Set'] == 'Z') & (df['Type'] == 'B'),
(df['Type'] == 'B')]
choices = ['yellow', 'blue', 'purple']
df['color'] = np.select(conditions, choices, default='black')
print(df)
qui donne
Set Type color
0 Z A yellow
1 Z B blue
2 X B purple
3 Y C black
df['foo'] = np.where(df['Set']=='Z', df['Set'], df['Type'].shift(1))
La compréhension des listes est une autre façon de créer une autre colonne de manière conditionnelle. Si vous travaillez avec des dtypes d'objet dans des colonnes, comme dans votre exemple, les compréhensions de liste surpassent généralement la plupart des autres méthodes.
Exemple de compréhension de liste:
% tests timeit:
la source
pd.DataFrame({'Type':list('ABBC')*100000, 'Set':list('ZZXY')*100000})
taille),numpy.where
dépassemap
, mais la compréhension de la liste est roi (environ 50% plus rapide quenumpy.where
).df['color'] = ['red' if (x['Set'] == 'Z') & (x['Type'] == 'B') else 'green' for x in df]
df['color_type'] = np.where(df['Set']=='Z', 'green', df['Type'])
.iterrows()
est notoirement lent et le DataFrame ne doit pas être modifié pendant l'itération.Un autre moyen d’y parvenir est de
la source
Voici encore une autre façon d'habiller ce chat, en utilisant un dictionnaire pour mapper de nouvelles valeurs sur les clés de la liste:
À quoi ça ressemble:
Cette approche peut être très puissante lorsque vous avez de nombreuses
ifelse
instructions de type à effectuer (c'est-à-dire de nombreuses valeurs uniques à remplacer).Et bien sûr, vous pouvez toujours faire ceci:
Mais cette approche est plus de trois fois plus lente que l'
apply
approche d'en haut, sur ma machine.Et vous pouvez également le faire en utilisant
dict.get
:la source
.map()
solution est ~ 10 fois plus rapide que.apply()
..apply()
prend 47 secondes, contre seulement 5,91 secondes pour.map()
.Ce qui suit est plus lent que les approches chronométrées ici , mais nous pouvons calculer la colonne supplémentaire en fonction du contenu de plus d'une colonne, et plus de deux valeurs peuvent être calculées pour la colonne supplémentaire.
Exemple simple utilisant uniquement la colonne "Set":
Exemple avec plus de couleurs et plus de colonnes prises en compte:
Edit (21/06/2019): Utilisation de plydata
Il est également possible d'utiliser plydata pour faire ce genre de choses (cela semble encore plus lent que d'utiliser
assign
etapply
, cependant).Simple
if_else
:Imbriqué
if_else
:la source
Peut-être que cela a été possible avec les nouvelles mises à jour de Pandas, mais je pense que ce qui suit est la réponse la plus courte et peut-être la meilleure pour l'instant. Vous pouvez utiliser le
.loc
méthode et utiliser une ou plusieurs conditions selon vos besoins.Résumé du code:
Explication:
ajouter une colonne «couleur» et définir toutes les valeurs sur «rouge»
Appliquez votre seule condition:
ou plusieurs conditions si vous le souhaitez:
Vous pouvez lire sur les opérateurs logiques Pandas et la sélection conditionnelle ici: Opérateurs logiques pour l'indexation booléenne dans Pandas
la source
df.loc[(df['Set']=="Z") & (df['Type']=="A"), 'Color'] = "green"
Un liner avec
.apply()
méthode suit:Après cela,
df
le bloc de données ressemble à ceci:la source
Si vous travaillez avec des données massives, une approche mémorisée serait la meilleure:
Cette approche sera plus rapide lorsque vous avez plusieurs valeurs répétées. Ma règle générale est de mémoriser quand:
data_size
>10**4
&n_distinct
<data_size/4
Ex Memoize dans un cas 10 000 lignes avec 2 500 ou moins de valeurs distinctes.
la source
random.choices()
.