#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'])