J'ai des données qui ressemblent à ceci:
Jake Ashley Intro to Philosophy 2 0 Algorithms 1 1 Spanish I 0 1 Vector Calculus 1 0 Total 4 2
Comment puis-je accéder à un décompte ou à un pivot qui ressemble à ci-dessous où l'instance qu'Ashley et Jake enseignent tous les deux à une classe est correctement ajoutée aux décomptes? L'instance d'un instructeur est triviale, mais deux ou plus pour une seule classe dans la même cellule me trébuche.
J'aimerais arriver à quelque chose comme ceci:
Class Instructor Intro to Philosophy Jake Algorithms Ashley/Jake Spanish I Ashley Vector Calculus Jake Intro to Philosophy Jake
3 Réponses :
Vous pouvez utiliser .str.get_dummies
pour diviser et binariser le champ Instructor
. Ensuite, vous pouvez grouper par Class
:
Ashley Jake Class Algorithms 1 1 Intro to Philosophy 0 2 Spanish I 1 0 Vector Calculus 0 1 Total 2 4
Production:
ret = (df['Instructor'].str.get_dummies('/') .groupby(df['Class']).sum() ) ret.loc['Total'] = ret.sum()
C'est bien. Clair et concis. Merci beaucoup.
Et si j'ajoutais un autre niveau de complexité en ajoutant une date de cours avec des lignes basées sur des étudiants comme ceci: `` Étudiant Classe Date du cours Instructeur Alex Introduction à la philosophie 4/11/20 Jake James Algorithms 11/5/20 Ashley / Jake Mike Spanish I 07/11/20 Ashley Steven Vector Calculus 11/5/20 Jake Denise Intro to Philosophy 11/8/20 Jake Carol Intro to Philosophy 11/8/20 Jake `` Comment pourrais-je obtenir un compte pour un enseignant par date de classe?
.groupby([df['Class'], df['Date']])
?
J'ai essayé cela, et cela crée un multiindex avec Course / Date, et j'aimerais les réduire en un seul compte, donc si j'avais Algorithms / 2020-10-22, Algorithmes / 2020-10-23, et Algorithmes / 2020 -10-24, j'obtiens juste un compte de 3 pour cet instructeur
Utilisez ensuite df['Course/Date'].str.extract('^([^/]+)')
?
Tu peux le faire:
In [1746]: df.Instructor = df.Instructor.str.split('/') In [1747]: df = df.explode('Instructor') In [1751]: x = df.groupby('Instructor').Class.value_counts().reset_index(level=0).pivot(columns='Instructor', values='Class').fillna(0) In [1754]: x.loc['Total'] = x.sum() In [1755]: x Out[1755]: Instructor Ashley Jake Class Algorithms 1.0 1.0 Intro_to_Philosophy 0.0 2.0 Spanish_I 1.0 0.0 Vector_Calculus 0.0 1.0 Total 2.0 4.0
Faisons un crosstab
après l' explode
df.Instructor = df.Instructor.str.split('/') df = df.explode('Instructor') out = pd.crosstab(df['Class'], df['Instructor'])