J'ai les données dans un pandas DataFrame:
ID Year status 844272365 1991 No 844272365 1992 No 844272365 1993 No 844272365 1994 No 844272365 1995 No 844272365 1996 No 844272365 1997 No 844272365 1998 No 844272365 1999 No 844272365 2000 No 844272365 2001 No 844272365 2002 No 844272365 2003 No 844272365 2004 No 844272365 2005 No 844272365 2006 No 844272365 2007 No 844272365 2008 No 844272365 2010 No 844272365 2011 No 844272365 2012 No 844272365 2013 Yes
Je souhaite remplacer les valeurs de la colonne status , qui a les valeurs Yes et No code> pour un identifiant basé sur la condition suivante:
Si un ID a au moins un Oui dans la colonne status alors toutes les observations (y compris Non ) dans la colonne status spécifique à cet ID est remplacé par Yes . Sinon, il reste inchangé.
Par exemple dans le DataFrame ci-dessous, 844272365 a Yes dans status dans la dernière ligne , alors toutes les observations précédentes dans status dans ces lignes spécifiques à 844272365 doivent être remplacées par Yes.
import pandas as pd
df = pd.read_csv('example_data_file.csv')
df.head()
ID Year status
223725 1991 No
223725 1992 No
223725 1993 No
223725 1994 No
223725 1995 No
3 Réponses :
Les éléments suivants devraient fonctionner:
s=set(df[df.status=='Yes']['ID'])
for i in range(len(df)):
if df.ID.iloc[i] in s:
df.status[i]='Yes'
Vous pouvez utiliser transformation :
df['new_status'] = (df
.groupby('ID')['status']
.transform(lambda x: 'Yes' if x.str.contains('Yes').any() else 'No'))
Vérifiez transform avec max
'Yes'>'No' # this is the reason why max work
Out[433]: True
df['new_status'] = df.groupby('ID')['status'].transform('max')
df
Out[435]:
ID Year status new_status
0 844272365 1991 No Yes
1 844272365 1992 No Yes
2 844272365 1993 No Yes
3 844272365 1994 No Yes
4 844272365 1995 No Yes
5 844272365 1996 No Yes
6 844272365 1997 No Yes
7 844272365 1998 No Yes
8 844272365 1999 No Yes
9 844272365 2000 No Yes
10 844272365 2001 No Yes
11 844272365 2002 No Yes
12 844272365 2003 No Yes
13 844272365 2004 No Yes
14 844272365 2005 No Yes
15 844272365 2006 No Yes
16 844272365 2007 No Yes
17 844272365 2008 No Yes
18 844272365 2010 No Yes
19 844272365 2011 No Yes
20 844272365 2012 No Yes
21 844272365 2013 Yes Yes
Utilisez
df ['Status'] = df.groupby ('ID') ['status']. Transform ('max')Toutes les colonnes spécifiques à cet identifiant, ou toutes les colonnes jusqu'au oui, spécifiques à cet identifiant ? Vous dites «tous les précédents» à un moment donné, donc vous ne savez pas si vous devez également changer les années futures.
Bienvenue TriG, je viens de répondre à cette question et je ne la trouve pas dans mes réponses maintenant ... avez-vous par hasard supprimé une question précédente? Si tu ne sais pas de quoi je parle peut-être que je suis fou, et pardonne-moi
@RichieV je pense que c'était une question différente (même df cependant)