請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
- 分組彙總與之前的一致。只是主鍵不同而已。
- res.groupby('teach')['value'].transform('sum') ,求出每位教師的總課時
- res['total'].rank(ascending=False) ,做一個排名。
這裡重點說一下這段代碼:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
- 分組彙總與之前的一致。只是主鍵不同而已。
- res.groupby('teach')['value'].transform('sum') ,求出每位教師的總課時
- res['total'].rank(ascending=False) ,做一個排名。
這裡重點說一下這段代碼:
- 這裡為了做圖表,需要確保每位教師都有上午和下午2行數據。但實際數據中有些教師只有半天的課(如下圖的教師 n56)。
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
- 分組彙總與之前的一致。只是主鍵不同而已。
- res.groupby('teach')['value'].transform('sum') ,求出每位教師的總課時
- res['total'].rank(ascending=False) ,做一個排名。
這裡重點說一下這段代碼:
- 這裡為了做圖表,需要確保每位教師都有上午和下午2行數據。但實際數據中有些教師只有半天的課(如下圖的教師 n56)。
- .set_index(['teach','apm']) ,先讓 teach 和 apm 做行索引。
- 此時 apm 行索引中都有上午和下午的值。
- .unstack() ,把 apm 從行索引移到列索引。那麼就會有 上午列 和 下午列。
- 注意此時,如果一位教師只有下午的課,那麼此列他的值就為 nan。
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
- 分組彙總與之前的一致。只是主鍵不同而已。
- res.groupby('teach')['value'].transform('sum') ,求出每位教師的總課時
- res['total'].rank(ascending=False) ,做一個排名。
這裡重點說一下這段代碼:
- 這裡為了做圖表,需要確保每位教師都有上午和下午2行數據。但實際數據中有些教師只有半天的課(如下圖的教師 n56)。
- .set_index(['teach','apm']) ,先讓 teach 和 apm 做行索引。
- 此時 apm 行索引中都有上午和下午的值。
- .unstack() ,把 apm 從行索引移到列索引。那麼就會有 上午列 和 下午列。
- 注意此時,如果一位教師只有下午的課,那麼此列他的值就為 nan。
- .stack(dropna=False) ,把 apm 從列索引移回去行索引,dropna=False ,讓其保留 nan 的值。
- 此時即可確保所有的教師都有上下午2行數據。
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
- 分組彙總與之前的一致。只是主鍵不同而已。
- res.groupby('teach')['value'].transform('sum') ,求出每位教師的總課時
- res['total'].rank(ascending=False) ,做一個排名。
這裡重點說一下這段代碼:
- 這裡為了做圖表,需要確保每位教師都有上午和下午2行數據。但實際數據中有些教師只有半天的課(如下圖的教師 n56)。
- .set_index(['teach','apm']) ,先讓 teach 和 apm 做行索引。
- 此時 apm 行索引中都有上午和下午的值。
- .unstack() ,把 apm 從行索引移到列索引。那麼就會有 上午列 和 下午列。
- 注意此時,如果一位教師只有下午的課,那麼此列他的值就為 nan。
- .stack(dropna=False) ,把 apm 從列索引移回去行索引,dropna=False ,讓其保留 nan 的值。
- 此時即可確保所有的教師都有上下午2行數據。
直接看可視化吧:
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
- 分組彙總與之前的一致。只是主鍵不同而已。
- res.groupby('teach')['value'].transform('sum') ,求出每位教師的總課時
- res['total'].rank(ascending=False) ,做一個排名。
這裡重點說一下這段代碼:
- 這裡為了做圖表,需要確保每位教師都有上午和下午2行數據。但實際數據中有些教師只有半天的課(如下圖的教師 n56)。
- .set_index(['teach','apm']) ,先讓 teach 和 apm 做行索引。
- 此時 apm 行索引中都有上午和下午的值。
- .unstack() ,把 apm 從行索引移到列索引。那麼就會有 上午列 和 下午列。
- 注意此時,如果一位教師只有下午的課,那麼此列他的值就為 nan。
- .stack(dropna=False) ,把 apm 從列索引移回去行索引,dropna=False ,讓其保留 nan 的值。
- 此時即可確保所有的教師都有上下午2行數據。
直接看可視化吧:
- 上圖可以看出來,n4 這教師是最多課時(20課時)
- 大部分的教師都是上午比下午課時多(這很可能是因為本來下午的課時就比上午少啊)- 有4位教師只有下午有課。
再看看每天分別是哪位教師比較忙的。
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
- 分組彙總與之前的一致。只是主鍵不同而已。
- res.groupby('teach')['value'].transform('sum') ,求出每位教師的總課時
- res['total'].rank(ascending=False) ,做一個排名。
這裡重點說一下這段代碼:
- 這裡為了做圖表,需要確保每位教師都有上午和下午2行數據。但實際數據中有些教師只有半天的課(如下圖的教師 n56)。
- .set_index(['teach','apm']) ,先讓 teach 和 apm 做行索引。
- 此時 apm 行索引中都有上午和下午的值。
- .unstack() ,把 apm 從行索引移到列索引。那麼就會有 上午列 和 下午列。
- 注意此時,如果一位教師只有下午的課,那麼此列他的值就為 nan。
- .stack(dropna=False) ,把 apm 從列索引移回去行索引,dropna=False ,讓其保留 nan 的值。
- 此時即可確保所有的教師都有上下午2行數據。
直接看可視化吧:
- 上圖可以看出來,n4 這教師是最多課時(20課時)
- 大部分的教師都是上午比下午課時多(這很可能是因為本來下午的課時就比上午少啊)- 有4位教師只有下午有課。
再看看每天分別是哪位教師比較忙的。
- n4 這位教師星期二下午就完全沒有課時。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
請關注本號,後續會有更多相關教程。轉發本文並私信我"python",即可獲得按水平領域分類好的Python資料
系列文章
- "替代Excel Vba"系列(一):用Python的pandas快速彙總
- "Python替代Excel Vba"系列(二):pandas分組統計與操作Excel
- "Python替代Excel Vba"系列(三):pandas處理不規範數據
前言
上一節我們已經成功把一份教師課程表整理成規範的形式,本節我們就看一下怎麼利用這份數據得到一些信息。並且儘可能讓每個部分都有可視化輸出。
本文要點:
- 使用 pandas 快速按需求做彙總整理。
注意:雖然本文是"Python替代Excel Vba"系列,但希望各位讀者明白,工具都是各有所長,選擇適合的工具,才是最好的。
案例
這次的數據是基於上一節已整理的教師課程表。如下圖:
- 表中的一行表示 某一天的某課時是哪位教師負責的哪門科目。
- 這裡的名字按照原有數據做了脫敏(teach 列)。
本文所用到的 pandas 技巧都在之前的章節已有詳細介紹,因此本文只對重點細節做講解
設定問題
本文的目標問題如下:
- 科目的分配情況如何?
- 教師的課時分配如何?
導入包
本文所需的包,安裝命令如下:
pip install pandas
pip install numpy
pip install pyecharts
建議你安裝 anaconda ,那麼最難安裝的 pandas 和 numpy 都不會是問題。
腳本中導入
- 本文使用 pyecharts 做可視化輸出
加載數據
代碼如下:
- 這次直接從 csv 文件讀取即可。
主科目佔比
要看主科目佔比,那麼首先根據科目劃分主次科目。如下:
- df['sj'].apply(lambda x: '語數英' if x in cond else '其他') ,根據科目列,劃分為"語數英"或"其他"
- 把劃分結果添加的新列 sj_class 。
現在數據如下:
現在可以看看主科目的數量。我們把彙總問題的主鍵列出,利用 pandas 的 groupby 方法即可快速做彙總。 如下:
- df.groupby(['sj_class']) ,按 sj_class 分組。
- .size() ,即可求得每組的個數。這裡使用 count 也可以,但你會注意到使用 count ,pandas 會把所有列都進行計數。並且 count 會忽略 nan ,而 size 則不會。
- .reset_index() ,調用 groupby 後,分組的 sj_class 會作為 index ,因此這裡只是把 sj_class 重新設置為列。
來看看實際佔比吧。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
按班級看科目佔比
只是看整體的佔比情況不太可以瞭解數據。我們試試再深入一些維度去看看數據。 看看每個級別的主科目佔比情況。如下:
- 這次我們的彙總主鍵是 級別和主科目。
- 可以看到其實與之前的流程基本一致,只是在分組時加上了 grade 字段。
看看圖表吧:
- 可以看到五年級的語數英課時佔比最大(為什麼不是六年級的主科目佔比最大?)。
- 七、八年級語數英沒有其他科目佔比大(初一初二語數英課時減少了?)。
教師分配情況
來個複雜一點的需求,看教師分配情況,我們設定如下要求:
- 每位教師的上下午課時數量,並且按課時數量排序。
- 每位教師每天的上下午課時數量,並且按課時數量排序。
首先,每位教師的上下午課時數量。主鍵是 教師和上下午。 代碼如下:
- 分組彙總與之前的一致。只是主鍵不同而已。
- res.groupby('teach')['value'].transform('sum') ,求出每位教師的總課時
- res['total'].rank(ascending=False) ,做一個排名。
這裡重點說一下這段代碼:
- 這裡為了做圖表,需要確保每位教師都有上午和下午2行數據。但實際數據中有些教師只有半天的課(如下圖的教師 n56)。
- .set_index(['teach','apm']) ,先讓 teach 和 apm 做行索引。
- 此時 apm 行索引中都有上午和下午的值。
- .unstack() ,把 apm 從行索引移到列索引。那麼就會有 上午列 和 下午列。
- 注意此時,如果一位教師只有下午的課,那麼此列他的值就為 nan。
- .stack(dropna=False) ,把 apm 從列索引移回去行索引,dropna=False ,讓其保留 nan 的值。
- 此時即可確保所有的教師都有上下午2行數據。
直接看可視化吧:
- 上圖可以看出來,n4 這教師是最多課時(20課時)
- 大部分的教師都是上午比下午課時多(這很可能是因為本來下午的課時就比上午少啊)- 有4位教師只有下午有課。
再看看每天分別是哪位教師比較忙的。
- n4 這位教師星期二下午就完全沒有課時。
上述2次彙總其實是可以定義為一個通用的方法。這裡是為了方便解析因此複製了2段差不多的代碼
最後
本文重點
- 從分析問題出提取主鍵,使用 groupby 即可快速得到數據。
- 靈活運用 stack 與 unstack ,可以快速做一些數據增補。
[源碼地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/excel_pandas/4)
請關注本號,後續會有更多相關教程。