分享5個(gè)數(shù)據(jù)處理更加靈活的pandas調(diào)用函數(shù)方法
0. 數(shù)據(jù)預(yù)覽
這里的數(shù)據(jù)是虛構(gòu)的語(yǔ)數(shù)外成績(jī),大家在演示的時(shí)候拷貝一下就好啦。
import pandas as pd df = pd.read_clipboard() df
姓名 | 語(yǔ)文 | 數(shù)學(xué) | 英語(yǔ) | 性別 | 總分 |
0 | 才哥 | 91 | 95 | 92 | 1 |
1 | 小明 | 82 | 93 | 91 | 1 |
2 | 小華 | 82 | 87 | 94 | 1 |
3 | 小草 | 96 | 55 | 88 | 0 |
4 | 小紅 | 51 | 41 | 70 | 0 |
5 | 小花 | 58 | 59 | 40 | 0 |
6 | 小龍 | 70 | 55 | 59 | 1 |
7 | 杰克 | 53 | 44 | 42 | 1 |
8 | 韓梅梅 | 45 | 51 | 67 | 0 |
1. apply
apply
可以對(duì)DataFrame
類(lèi)型數(shù)據(jù)按照列或行進(jìn)行函數(shù)處理,默認(rèn)情況下是按照列(單獨(dú)對(duì)Series
亦可)。
在案例數(shù)據(jù)中,比如我們想將性別列中的1
替換為男,0
替換為女,那么可以這樣搞定。
先自定義一個(gè)函數(shù),這個(gè)函數(shù)有一個(gè)參數(shù) s(Series類(lèi)型數(shù)據(jù))。
def getSex(s): ? ? if s==1: ? ? ? ? return '男' ? ? elif s==0: ? ? ? ? return '女'
上述函數(shù)還有更簡(jiǎn)潔寫(xiě)法,這里方便理解采用最直觀的寫(xiě)法哈。
然后,我們直接使用apply
去調(diào)用這個(gè)函數(shù)即可。
df['性別'].apply(getSex)
可以看到輸出結(jié)果如下:
0 男
1 男
2 男
3 女
4 女
5 女
6 男
7 男
8 女
Name: 性別, dtype: object
當(dāng)然,我們也可以直接用調(diào)用匿名函數(shù)lambda
的形式:
df['性別'].apply( lambda s: '男' if s==1 else '女' )
可以看到結(jié)果是一樣的:
0 男
1 男
2 男
3 女
4 女
5 女
6 男
7 男
8 女
Name: 性別, dtype: object
以上是單純根據(jù)一列的值條件進(jìn)行的數(shù)據(jù)處理,我們也可以根據(jù)多列組合條件(可以了解為按行)進(jìn)行處理,需要注意這種情況下需要指定參數(shù)axis=1
,具體看下面案例。
案例中,我們認(rèn)為總分高于200且數(shù)學(xué)分?jǐn)?shù)高于90為高分
# 多列條件組合 df['level'] = df.apply(lambda df: '高分' if df['總分']>=200 and df['數(shù)學(xué)']>=90 else '其他', axis=1) df
同樣,上述用apply
調(diào)用的函數(shù)都是自定義的,實(shí)際上我們也可以調(diào)用內(nèi)置或者pandas
/numpy
等自帶的函數(shù)。
比如,求語(yǔ)數(shù)外和總分最高分:
# python內(nèi)置的函數(shù) df[['語(yǔ)文','數(shù)學(xué)','英語(yǔ)','總分']].apply(max)
語(yǔ)文 96
數(shù)學(xué) 95
英語(yǔ) 94
總分 278
dtype: int64
求語(yǔ)數(shù)外和總分平均分:
# numpy自帶的函數(shù) import numpy as np df[['語(yǔ)文','數(shù)學(xué)','英語(yǔ)','總分']].apply(np.mean)
語(yǔ)文 69.777778
數(shù)學(xué) 64.444444
英語(yǔ) 71.444444
總分 205.666667
dtype: float64
2. applymap
applymap
則是對(duì)每個(gè)元素的函數(shù)處理,變量是每個(gè)元素值。
比如對(duì)語(yǔ)數(shù)外三科超過(guò)90
分認(rèn)為是科目高分
df[['語(yǔ)文','數(shù)學(xué)','英語(yǔ)']].applymap(lambda x:'高分' if x>=90 else '其他')
語(yǔ)文 | 數(shù)學(xué) | 英語(yǔ) |
0 | 高分 | 高分 |
1 | 其他 | 高分 |
2 | 其他 | 其他 |
3 | 高分 | 其他 |
4 | 其他 | 其他 |
5 | 其他 | 其他 |
6 | 其他 | 其他 |
7 | 其他 | 其他 |
8 | 其他 | 其他 |
3. map
map
則是根據(jù)輸入對(duì)應(yīng)關(guān)系映射值返回最終數(shù)據(jù),作用于某一列
。傳入的值可以是字典,鍵值為原始值,值為需要替換的值。也可以傳入一個(gè)函數(shù)或者字符格式化表達(dá)式等等。
以上面性別列中的1
替換為男,0
替換為女為例,還可以通過(guò)map
來(lái)實(shí)現(xiàn)
df['性別'].map({1:'男', 0:'女'})
輸出結(jié)果也是一致的:
0 男
1 男
2 男
3 女
4 女
5 女
6 男
7 男
8 女
Name: 性別, dtype: object
比如總分列想變成格式化字符:
df['總分'].map('總分:{}分'.format)
0 總分:278分
1 總分:266分
2 總分:263分
3 總分:239分
4 總分:162分
5 總分:157分
6 總分:184分
7 總分:139分
8 總分:163分
Name: 總分, dtype: object
4. agg
agg
一般用于聚合,在分組或透視操作中常見(jiàn)到,用法是和apply
比較接近。
比如,求語(yǔ)數(shù)外和總分的最高分、最低分和平均分
df[['語(yǔ)文','數(shù)學(xué)','英語(yǔ)','總分']].agg(['max','min','mean'])
我們還可以對(duì)不同的列進(jìn)行不同的運(yùn)算(用字典形式指定)
# 語(yǔ)文最高分、數(shù)學(xué)最低分和英文最高最低分 df.agg({'語(yǔ)文':['max'],'數(shù)學(xué)':'min','英語(yǔ)':['max','min']})
當(dāng)然也支持自定義函數(shù)的調(diào)用
5. pipe
以上四個(gè)調(diào)用函數(shù)的方法,我們發(fā)現(xiàn)被調(diào)用的函數(shù)的參數(shù)就是 ??DataFrame?
??或Serise
數(shù)據(jù),如果我們被調(diào)用的函數(shù)還需要?jiǎng)e的參數(shù),那么該如何做呢?
所以,pipe
就出現(xiàn)了。
pipe又稱(chēng)管道方法,可以將我們的處理分析過(guò)程標(biāo)準(zhǔn)化、流程化。它在調(diào)用函數(shù)的時(shí)候可以帶被調(diào)用函數(shù)的其他參數(shù),這樣就方便自定義函數(shù)的功能擴(kuò)展了。
比如,我們需要獲取總分大于n,性別為sex的同學(xué)的數(shù)據(jù),其中n和sex是可變參數(shù),那么用apply
等就不太好處理。這個(gè)時(shí)候,就可以用到??pipe?
?方法來(lái)搞事了!
我們先定義一個(gè)函數(shù):
# 定義一個(gè)函數(shù),總分大于等于n,性別為sex的同學(xué)數(shù)據(jù)(sex為2表示不分性別) def total(df, n, sex): dfT = df.copy() if sex == 2: return dfT[(dfT['總分']>=n)] else: return dfT[(dfT['總分']>=n) & (dfT['性別']==sex)]
如果我們要找到總分大于200,不分性別的學(xué)生成績(jī),可以這樣:
df.pipe(total,200,2)
再找總分大于150,性別為男生(1)的學(xué)生成績(jī),可以這樣:
df.pipe(total,150,1)
再找總分大于200,性別為女生(0)的學(xué)生成績(jī),可以這樣:
df.pipe(total,200,0)
以上就是本次我們介紹的5種調(diào)用函數(shù)的方法,這些操作技巧可以讓我們?cè)谔幚頂?shù)據(jù)時(shí)更加靈活自如
到此這篇關(guān)于分享5個(gè)數(shù)據(jù)處理更加靈活的pandas調(diào)用函數(shù)方法的文章就介紹到這了,更多相關(guān)pandas調(diào)用函數(shù)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python?Pandas讀取Excel日期數(shù)據(jù)的異常處理方法
- Python數(shù)據(jù)處理的26個(gè)Pandas實(shí)用技巧總結(jié)
- python?pandas數(shù)據(jù)處理教程之合并與拼接
- 詳解pandas中缺失數(shù)據(jù)處理的函數(shù)
- python優(yōu)化數(shù)據(jù)預(yù)處理方法Pandas pipe詳解
- python數(shù)據(jù)處理67個(gè)pandas函數(shù)總結(jié)看完就用
- pandas中對(duì)文本類(lèi)型數(shù)據(jù)的處理小結(jié)
- 淺談Pandas dataframe數(shù)據(jù)處理方法的速度比較
- 六個(gè)實(shí)用Pandas數(shù)據(jù)處理代碼
相關(guān)文章
jupyter?notebook加載和運(yùn)行.py文件方式
這篇文章主要介紹了jupyter?notebook加載和運(yùn)行.py文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07windows 10 設(shè)定計(jì)劃任務(wù)自動(dòng)執(zhí)行 python 腳本的方法
這篇文章主要介紹了windows 10 設(shè)定計(jì)劃任務(wù)自動(dòng)執(zhí)行 python 腳本的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Python計(jì)算程序運(yùn)行時(shí)間的方法
這篇文章主要介紹了Python計(jì)算程序運(yùn)行時(shí)間的方法,分別記錄起始時(shí)間與結(jié)束時(shí)間,計(jì)算兩者之間的差值來(lái)獲得程序的運(yùn)行時(shí)間,需要的朋友可以參考下2014-12-12在Python中,不用while和for循環(huán)遍歷列表的實(shí)例
今天小編就為大家分享一篇在Python中,不用while和for循環(huán)遍歷列表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02解決jupyter (python3) 讀取文件遇到的問(wèn)題
這篇文章主要介紹了解決jupyter (python3) 讀取文件遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python常用配置文件ini、json、yaml讀寫(xiě)總結(jié)
用的配置文件格式有ini、json、yaml等,下面簡(jiǎn)單給大家介紹下,Python如何讀寫(xiě)這幾種格式的文件,對(duì)Python讀寫(xiě)ini、json、yaml配置文件相關(guān)知識(shí)感興趣的朋友一起看看吧2021-07-07Python+Turtle動(dòng)態(tài)繪制一棵樹(shù)實(shí)例分享
這篇文章主要介紹了Python+Turtle動(dòng)態(tài)繪制一棵樹(shù)實(shí)例分享,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Pytest生成測(cè)試報(bào)告的實(shí)現(xiàn)
本文介紹了如何使用 pytest-html 插件生成測(cè)試報(bào)告,并提供了詳細(xì)的操作步驟、配置項(xiàng)和示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11