本文示例程式碼及檔案已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
pandas
發展瞭如此多年,所包含的功能已經覆蓋了大部分資料清洗、分析場景,但仍然有著相當一部分的應用場景pandas
中尚存空白亦或是現階段的操作方式不夠簡潔方便。
今天我要給大家介紹的Python
庫pyjanitor
就內建了諸多功能方法,可以在相容pandas
中資料框等資料結構的同時為pandas
補充更多功能。它是對R
中著名的資料清洗包janitor
的移植,就如同它的名字那樣,幫助我們完成資料處理的清潔工作:
2 pyjanitor中的常用功能
對於使用conda
的朋友,推薦使用下列命令完成pyjanitor
的安裝,其中使用到上海交大的conda-forge
映象:
conda install pyjanitor -c https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge -y
完成安裝後import janitor
即可進行匯入,接著我們就可以直接在pandas
的程式碼邏輯中穿插pyjanitor
的各種API介面。
pyjanitor
中的很多功能實際上跟pandas
中的一些功能存在重疊,作為一位pandas
老手,這部分功能費老師我還是傾向於使用pandas
完成,因此下面我只給大家介紹一些pyjanitor
中頗具特色的功能:
2.1 利用also()方法穿插執行任意函式
熟悉pandas
鏈式寫法的朋友應該知道這種寫法對於處理資料和理清步驟有多高效,pyjanitor
中的also()
方法允許我們在鏈式過程中隨意插入執行任意函式,接受上一步狀態的資料框運算結果,且不影響對下一步處理邏輯的資料輸入,我非常喜歡這個功能,下面是一個簡單的例子:
df = (
# 構造示例資料框
pd.DataFrame({"a": [1, 2, 3], "b": list("abc")})
.query("a > 1")
# 利用also()插入lambda函式接受上一步的輸入物件
.also(lambda df: print(f"a欄位<=1的記錄有{df.query('a <= 1').shape[0]}行"))
.rename(columns={'a': 'new_a'})
# 利用also()實現中間計算結果的匯出
.also(lambda df: df.to_csv("temp.csv", index=False))
# 利用also()列印到這一步時資料框計算結果的欄位名
.also(
lambda df: print(f"欄位名:{df.columns.tolist()}")
)
.drop(columns='b')
)
df
2.2 利用case_when()方法實現多條件分支
pyjanitor
中的case_when()
方法可以幫助我們針對資料框實現類似SQL
中的的多條件分支運算,注意,因為是多條件分支,所以包含最後的“其他”條件在內,需要至少定義3條分支規則,參考下面的例子:
df = pd.DataFrame(
{
"a": [0, 0, 1, 2],
"b": [0, 3, 4, 5],
"c": [6, 7, 8, 9],
}
)
df.case_when(
((df.a == 0) & (df.b == 0)), '類別1',
((df.a == 0) & (df.b != 0)), '類別2',
# 其他情況
'類別3',
column_name="類別",
)
2.3 利用conditional_join()實現條件連線
pyjanitor
中的conditional_join()
非常地好用,它彌補了pandas
一直以來都未完善的“條件連線”功能,即我們對兩張表進行連線的條件,不只pandas
中的merge()
、join()
之類的方法所實現的,左表與右表的指定欄位之間相等
這樣簡單的條件判斷,而是可高度自定義的條件判斷。
conditional_join()
在作為方法使用時,其第一個引數應傳入連線中的右表資料框,緊接著的是若干個格式為(左表欄位, 右表欄位, 判斷條件)
這樣的三元組來定義單條或多條條件判斷的且組合,之後再用於定義連線方式how
引數。
下面是一個示例,這裡我們實現生信中常見的一種資料分析操作,左表和右表各自定義了一些區間段,我們利用條件連線來為左表找到右表中完全被其包住的區間:
# 定義示例左表
df_left = pd.DataFrame({
'id': list('abcd'),
'left_range_start': [2, 9, 14, 30],
'left_range_end': [5, 11, 21, 35]
})
# 定義示例右表
df_right = pd.DataFrame({
'id': list('ijxy'),
'right_range_start': [2, 6, 15, 28],
'right_range_end': [3, 10, 18, 31]
})
進行條件連線:
(
df_left
.conditional_join(
df_right,
# 滿足left_range_start <= right_range_start
('left_range_start', 'right_range_start', '<='),
# 且滿足left_range_end >= right_range_end
('left_range_end', 'right_range_end', '>=')
)
)
連線結果如下:
2.4 利用move()方法快捷完成欄位位置調整
pyjanitor
中的move()
方法用於快捷調整某行或某列資料的位置,通過source
引數指定需要移動的資料行index
或列的欄位名,target
引數用於指定移動的目標位置資料行index
或列的欄位名,position
用於設定移動方式('before'
表示移動到目標之前一個位置,after
表示後一個位置),axis
用於設定移動方式(0
表示行移動,1
表示列移動)。
以最常用的列移動為例:
而除了上述這些頗具特色的功能外,pyjanitor
中還針對生信、化學、金融、機器學習、數學等領域內建了一些特別的功能,感興趣的朋友可以前往其官網https://pyjanitor-devs.github.io/pyjanitor/
進一步瞭解相關內容。
以上就是本文的全部內容,歡迎在評論區與我進行討論~