系列列表
前言
在本系列的上一章已經(jīng)介紹了如何讀寫 excel 數(shù)據(jù),并快速進行匯總處理。但有些小伙伴看完之后有些疑惑:
今天,我就沿用上一章的數(shù)據(jù),把需求升級一下,以解決上述疑點。
本文要點:
使用 xlwings ,設(shè)置單元格格式
使用 pandas 快速做高難度分組操作
注意:雖然本文是'Python替代Excel Vba'系列,但希望各位讀者明白,工具都是各有所長,適合才是最好。
案例
數(shù)據(jù)與上一節(jié)一樣,就一個學生的數(shù)據(jù)表。
不過這次我們需要把每個班級成績好的同學給揪出來好好表揚,因此條件如下:
導(dǎo)入包
本文所需的包,安裝命令如下:
pip install xlwingspip install pandas
腳本中導(dǎo)入
本文只說重點細節(jié),至于如何從 excel 中讀取數(shù)據(jù),上一節(jié)已經(jīng)有詳細介紹。
排名
首先需要解決的是怎么得到班級 top 3? 首要任務(wù)是得到排名,如下:
這里需要在數(shù)據(jù)中新增一列[排名]
df.groupby('班級') 就是按 班級 分組的意思。
df.groupby('班級')['總分'] 表示分組后每個組我們只使用[總分]這個字段。
.rank(ascending=False,method='min') 是 pandas 中進行排名的處理。
參數(shù) ascending=False ,表明需要以 [總分] 倒序做排名。
參數(shù) method='min' , 表明如果有多個人有相同的總分,那么全部的人都用所有名次中最小的排名值。后面會看到數(shù)據(jù)。
此時顯示變量 rank 的數(shù)據(jù),可以看到結(jié)果就是排名結(jié)果(1列數(shù)據(jù))
在 pandas 中往 DataFrame 中新增一列非常簡單。 df['排名']=rank ,即可把排名結(jié)果放入表中新增的字段中。
df.sort_values(['班級','排名'],inplace=True) ,按先[班級]后[排名]進行排序,不是必須的,只是為了方便查看數(shù)據(jù)。
參數(shù) inplace=True ,表示直接在原有數(shù)據(jù)上操作,如果不設(shè)置這個參數(shù),那么就需要寫 df=df.sort_values(['班級','排名'])
來看看結(jié)果。
找出低水平學生
現(xiàn)在找出低于所在班級平均分的同學吧。 先按班級計算平均分,然后把平均分填到每一行上。
df.groupby('班級')['總分'] 就不用說了,與上面的排名是一樣的意思。
.transform('mean') ,表示每組求平均。結(jié)果是每組都有一個分數(shù)。而 transform 方法的特點就是不會壓縮原數(shù)據(jù)的行數(shù),因此每組的數(shù)都是一樣的平均分。
df['班級均分']=class_avg ,同樣新增一列。
看看數(shù)據(jù)
對于這里的 transform 方法可能有些小伙伴會不太理解。可以查看本號的相關(guān)文章,關(guān)注我噢。
萬事俱備
看到這里,你可能會覺得很復(fù)雜,但注意,我們只是寫了2句代碼即可做到了比較復(fù)雜的分組匯總。
首先把 top 3的同學挑出來
接著把低于平均分的也挑出來
但是,需求是需要我們在原表格上標記顏色。怎么可以用目前的結(jié)果數(shù)據(jù)關(guān)聯(lián)到原數(shù)據(jù)上。
我們注意看得到的結(jié)果中的 index。就是最左邊的那一列數(shù)字
每個 DataFrame 都會有這樣的 index,不管你怎么操作他,這個 index 都不會改變。因此我們可以利用 index 定位 excel 的單元格,然后通過 xlwings 標記底色就好了。
給表格加點顏色
首先定義一個設(shè)置顏色的方法
indices=(n for n in arg_df.index) , 獲得結(jié)果的索引值。
rng=top_range.offset(i).resize(1,cols_count) ,定位需要設(shè)置顏色的行。
rng.api.Interior.Color = color ,設(shè)置單元格底色。注意這里 .api 是因為 xlwings 是對 com 的封裝,因此許多對象都提供了 api 這個屬性,以便你能用 com 對象那套方法去操作。
如果你對 excel 不熟悉,可能你會問,你怎么知道設(shè)置顏色是這些代碼? 其實我是通過錄制宏來得到。如下:
完整代碼
以下是完整的代碼:
本節(jié)就不再上 vba 代碼了(沒人愿意寫~~)。
使用 pandas 到底好處是什么
目前為止,你可以看到 Python 處理 excel 數(shù)據(jù)的基本套路是
從 excel 中讀取數(shù)據(jù)到 pandas 的數(shù)據(jù)結(jié)構(gòu)中
使用 pandas 做各種處理
把結(jié)果回寫到 excel 上
如果你熟悉 vba ,那么 pandas 就像一個數(shù)組+ sql 的多功能工具。
總結(jié)
通過本文應(yīng)該可以解答之前的一些疑惑。像本次需求中的數(shù)據(jù)處理任務(wù),即使你用透視表來解決也是不容易的,更不用說用 vba 了。 使用 python 不僅代碼簡潔易懂,并且整個過程都可以重復(fù)執(zhí)行。
[源碼地址](
https://github.com/CrystalWindSnake/Creative/tree/master/python/excel_pandas/2)