1
votes

Comptage / Pivot du tableau avec plusieurs valeurs dans la cellule

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


0 commentaires

3 Réponses :


3
votes

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()


5 commentaires

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('^([^/]+)') ?



2
votes

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


0 commentaires

1
votes

Faisons un crosstab après l' explode

df.Instructor = df.Instructor.str.split('/')

df = df.explode('Instructor')

out = pd.crosstab(df['Class'], df['Instructor'])


0 commentaires