J'ai une trame de données (DF) en python avec 4 colonnes (ID, statut, personne, sortie). Chaque identifiant est répété 6 fois et la sortie est la même pour chaque identifiant. Pour chaque identifiant, le statut sera activé / désactivé (3 de chacun).
J'ai besoin de générer une nouvelle colonne avec une liste de personnes pour chaque combinaison d'identifiant / statut unique. J'ai aussi besoin d'une deuxième nouvelle colonne avec un identifiant de groupe pour chaque liste unique de personnes. p>
Ceci est mon code actuel qui fonctionne, mais est très lent lorsque vous travaillez avec une image de données importante en raison de la fonction Appliquer (List). Y a-t-il un moyen plus efficace de faire cela? p> Voici un exemple de cadre de données d'entrée: p> La sortie souhaitée est la suivante: p> df =
ID Status People Group_ID Output
0 On [John, Mark, Michael ] 0 1
0 Off [Peter, Tim, Jake ] 1 1
1 On [Peter, Dennis, Jasper ] 2 0.5
1 Off [John, Mark, Michael ] 0 0.5
2 On [John, Mark, Larry ] 3 2
2 Off [Peter, Dennis, Jasper ] 2 2
3 Réponses :
Essayez ceci: sortie: p> ou p>
Tellement plus simple que le mien. Je vais devoir étudier celui-ci. Vous avez laissé tomber "Sortie" cependant. Je n'ai pas réalisé que vous pourriez utiliser. Appliquer à la fin d'une groupe, en particulier à une liste.
df['Person1'] = df['Person'].shift(-1) df['Person2'] = df['Person'].shift(-2) df['People'] = '[' + df['Person'] + ',' + df['Person1'] + ',' + df['Person2'] + ']' mult_3 = [] for i in df.index: if i==0 or i%3 == 0: mult_3.append(i) df = df.loc[df.index.isin(mult_3)].drop(['Person', 'Person1', 'Person2'], axis=1) df_people = df.groupby('People').Status.count().reset_index().drop(['Status'], axis=1).reset_index() df = df.merge(df_people, how='left', on='People').rename(columns={'index':'Group_ID'}) df = df[['ID', 'Status', 'People', 'Group_ID', 'Output']] df
Python 3.7.6 et Pandas 1.0.3: strong> Le goulot d'étranglement ici est probablement le Appliquer code> appels.