2 votes

La manière la plus élégante de coder un nombre arbitraire de niveaux d'imbrication.

Pour mieux expliquer le problème, je vais donner quelques détails en utilisant la bibliothèque pandas mais je pense que l'idée centrale de la question est assez générale, comme l'indique le titre.

La question générale : Quelle est la manière la plus élégante de coder un nombre arbitraire d'imbrication de boucles.

Exemple spécifique : prenez une fonction doStruf(df, listLevels) avec df étant un objet pandas DataFrame et listLevels étant une liste de noms de caractéristiques organisées hiérarchiquement (par exemple, personne, classes, écoles, ..., états) des unités d'observation décrites dans df. Pour doStruf(df, ["person", "classes", ..., "states"]) Je voudrais que la fonction doStruf fasse quelque chose comme

for person in unique(array(df["person"])):

    personData = df[df["person"] == person]
    for classroom in unique(array(personData["classrooms"])) :
        classroomData = personData[personData["classroom"] == classroom]

        ... arbritrary number of loops imbrication depending on len(listLevels) ...

             varYData = varXData[varXData["varY"] == varY]
             for state in unique(array(varYData["states"])) :
                 stateData = varYData[varYData["state"] == state]

                 ... do stuff using stateData ...

Quelle est la manière la plus propre de traiter ce type de nombre d'imbrications de boucles défini par l'exécution ?

2voto

Andy Hayden Points 38010

Vous pouvez le faire en utilisant un groupby :

g = df.groupby(['person', 'classes', ..., 'varY', 'states'])

g.apply(lambda stateData: do_stuff(stateData))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X