Подсчет / свод таблицы с несколькими значениями в ячейке

#python #python-3.x #pandas #dataframe

#python #python-3.x #панды #фрейм данных

Вопрос:

У меня есть некоторые данные, которые выглядят следующим образом:

 Class                    Instructor
Intro to Philosophy      Jake
Algorithms               Ashley/Jake
Spanish I                Ashley
Vector Calculus          Jake
Intro to Philosophy      Jake
  

Как я могу перейти к подсчету или сводке, которые выглядят так, как показано ниже, где экземпляр, который Эшли и Джейк преподают в классе, правильно добавляется к подсчетам? Экземпляр одного инструктора тривиален, но два или более для одного класса в одной ячейке сбивают меня с толку.

Я хотел бы перейти к чему-то вроде этого:

                          Jake        Ashley
Intro to Philosophy         2             0
Algorithms                  1             1
Spanish I                   0             1
Vector Calculus             1             0
Total                       4             2
  

Ответ №1:

Вы можете использовать .str.get_dummies для разделения и бинаризации Instructor поля. Затем вы можете сгруппировать Class :

 ret = (df['Instructor'].str.get_dummies('/')
     .groupby(df['Class']).sum()
)
ret.loc['Total'] = ret.sum()
  

Вывод:

                      Ashley  Jake
Class                            
Algorithms                1     1
Intro to Philosophy       0     2
Spanish I                 1     0
Vector Calculus           0     1
Total                     2     4
  

Комментарии:

1. Это здорово. Ясно и кратко. Большое вам спасибо.

2. Что, если я добавлю еще один уровень сложности, добавив дату курса со строками, основанными на таких студентах: « Студент класса Дата курса Преподаватель Алекс Введение в философию 11/4/20 Джейк Джеймс Алгоритмы 11/5/20 Эшли / Джейк Майк Испанский Я 11/7/20 Эшли Стивен Векторное исчисление 11/5/20 Джейк Дениз Введение в философию 11/8/20 Джейк Кэрол Введение вФилософия 11/8/20 Джейк « Как я могу получить одно количество для учителя на дату урока?

3. .groupby([df['Class'], df['Date']]) ?

4. Я попробовал это, и это создает мультииндекс с курсом / датой, и я бы хотел свести их к одному счету, поэтому, если бы у меня были алгоритмы / 2020-10-22, Алгоритмы / 2020-10-23 и алгоритмы / 2020-10-24, я просто получаю количество 3 для этого инструктора

5. Затем использовать df['Course/Date'].str.extract('^([^/] )') ?

Ответ №2:

Вы можете сделать это:

 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
  

Ответ №3:

Давайте сделаем crosstab после explode

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

df = df.explode('Instructor')

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