使用 pandas 得到一个学期内每个科目的总数 类

Get total no of classes of each subject within a semester using pandas

时间 table,列=小时,行=工作日,数据=主题

[工作日 x 小时]

                               1                      2                 3             4                 5                      6                      7
Name                                                                                                                                                   
Monday                   Project                Project           Project  Data Science  Embedded Systems            Data Mining  Industrial Psychology
Tuesday                  Project                Project           Project       Project      Data Science  Industrial Psychology       Embedded Systems
Wednesday           Data Science                Project           Project       Project           Project                Project                Project
Thursday             Data Mining  Industrial Psychology  Embedded Systems   Data Mining           Project                Project                Project
Friday     Industrial Psychology       Embedded Systems      Data Science   Data Mining           Project                Project                Project

频率table行=工作日,列=主题,数据=相应工作日的主题频率

[工作日 x 主题]

Data       Data Mining  Data Science  Embedded Systems  Industrial Psychology  Project
Name                                                                                  
Friday               1             1                 1                      1        3
Monday               1             1                 1                      1        3
Thursday             2             0                 1                      1        3
Tuesday              0             1                 1                      1        4
Wednesday            0             1                 0                      0        6                            

代码

self.start = datetime(2022, 1, 1)
self.end = datetime(2022, 3, 31)

self.file = 'timetable.csv'
self.sdf = pd.read_csv(self.file, header=0, index_col="Name")
self.subject_frequency = self.sdf.apply(pd.value_counts).fillna(0)
print(self.subject_frequency.to_string())
self.subject_frequency["sum"] = self.subject_frequency.sum(axis=1)

self.p = self.sdf.melt(var_name='Freq', value_name='Data', ignore_index=False).assign(variable=1)\
            .pivot_table('Freq', 'Name', 'Data', fill_value=0, aggfunc='count')
print(self.p.to_string())

必填Table

                       classes ...
Data Mining            32        
Data Science           32
Embedded Systems       32
Industrial Psychology  32
Project                146     

稍后将添加更多列,例如当前出勤率、每个 class 缺席的下降百分比、周一、周二休假的损失百分比等,以便从出勤率中减去它们.

最终目标是分析哪一天可以安全休假,并监控我的百分比。如果我的方向可以更好,请多多指教

select_rows = [date.strftime("%A") for date in pd.bdate_range(self.start, self.end)]
r = self.p.loc[select_rows, :]
print(r.to_string())
print(r.sum())

请随意添加更简单的代码,设计建议也很感激!

一种可能的方法是像您一样使用 bdate_range 并使用 weekday 到 select 工作日 (0-4) 和 map 这些数字到它们对应的工作日名称;然后reindex频率table。然后你会得到一个 DataFrame,其中每一行对应于 2022-1-1 和 2022-3-31 之间的一个工作日。然后 sum 找到每个 class:

的总数
out = (freqtable.reindex(pd.bdate_range('2022-1-1','2022-3-31').weekday
                         .map(dict(enumerate(['Monday','Tuesday','Wednesday','Thursday','Friday']))))
       .sum()
       .rename_axis(['classes']).reset_index(name='count'))

输出:

                 classes  count
0            Data Mining     51
1           Data Science     51
2       Embedded Systems     51
3  Industrial Psychology     51
4                Project    244