0
votes

Méthode efficace pour générer une liste de valeurs à partir d'une colonne dans une trame de données basée sur des colonnes secondaires communes

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> xxx pré>

Voici un exemple de cadre de données d'entrée: p> xxx pré>

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


0 commentaires

3 Réponses :


2
votes

Essayez ceci: xxx

sortie: xxx

ou xxx


1 commentaires

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.



0
votes
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

0 commentaires

0
votes

Python 3.7.6 et Pandas 1.0.3: Le goulot d'étranglement ici est probablement le Appliquer appels. XXX

Sortie: xxx


0 commentaires