J'ai une liste d'amis qui participent à ma fête:

import pandas as pd
d = {'name': ['Alice', 'Bob', 'Charlie'], 'is_here': [True, True, False]}
df = pd.DataFrame(data=d)

Question: Comment puis-je basculer le is_here booléen en fonction d'un nom donné? (par exemple, comment faire de toggle('Charlie') transforme le False en True dans mon DataFrame?)


Je peux obtenir son statut de booléen en utilisant df[df['name'] == 'Charlie'].iloc[0]['is_here'], mais j'ai du mal à changer la valeur dans df.

4
ebosi 13 avril 2018 à 03:59

3 réponses

Meilleure réponse

Basculer Charlie avec xor

df.loc[df.name.eq('Charlie'), 'is_here'] ^= True

df

   is_here     name
0     True    Alice
1     True      Bob
2     True  Charlie

Explication

Un seul peut être vrai
Table de vérité pour xor

       x      y  x ^ y
0   True   True  False
1   True  False   True
2  False   True   True
3  False  False  False

Donc:
si x = True, x ^ True est évalué à False
si x = False, x ^ True est évalué à True

En utilisant ^= sur le loc, nous prenons le xor avec True pour tous les éléments représentés avec la tranche et attribuons les résultats en place.

5
piRSquared 13 avril 2018 à 01:22

Vous pouvez utiliser set_index + .loc

df.set_index('name',inplace=True)
df.loc['Alice']
Out[164]: 
is_here    True
Name: Alice, dtype: bool

Mise à jour

df.loc[df.name=='Charlie','is_here']=True
df
Out[176]: 
   is_here     name
0     True    Alice
1     True      Bob
2     True  Charlie

Update 2

df.loc[df.name=='Charlie','is_here']=~df['is_here']
df
Out[185]: 
   is_here     name
0     True    Alice
1     True      Bob
2     True  Charlie
3
YOBEN_S 13 avril 2018 à 01:16

Pour mettre à jour votre cartographie

df = df.set_index('name')
df.loc['Charlie', 'is_here'] = ~df.loc['Charlie', 'is_here']

print(df.reset_index())

#       name  is_here
# 0    Alice     True
# 1      Bob     True
# 2  Charlie     True

Pour interroger votre cartographie

Depuis votre dataframe:

ishere = df.set_index('name')['is_here'].get

print(ishere('Alice'))  # True

À partir de votre dictionnaire d'origine:

ishere = dict(zip(d['name'], d['is_here'])).get

print(ishere('Alice'))  # True
3
jpp 13 avril 2018 à 01:10