3個Pandas的寶藏函數
大家好,我是Peter呀~
在利用Pandas進行數據處理的時候,我們經常需要對某行或者某列的數據、甚至是全部的元素執行某個相同的操作。
Pandas中的map
、apply
和applymap
就可以解決絕大部分這樣的數據處理需求,讓你不再重複操作。本文結合具體的例子來講解如何使用這3個寶藏函數。
Pandas連載文章
目前已經連載了17篇文章,其中1-16篇屬於《深入淺出Pandas數據分析》的第一版,從第17篇的透視表和交叉表開始,屬於進階內容。
模擬數據
下面是一份主要模擬的數據,幾位同學的個人信息(數據僅供學習)
import numpy as np
import pandas as pd
data = pd.DataFrame({"name":["小明","小紅","小張","小周","小孫","小王"],
"sex":["男","女","女","男","男","男"],
"birthday":["2003-07-07","1993-08-09","1999-03-05","1995-08-19","2002-11-18","1996-07-01"],
"address":["深圳南山區","廣州越秀區","浙江杭州","上海","北京海淀","湖北省武漢市武昌"],
"age":[18,28,22,26,19,25],
"height":[189,178,167,172,182,185],
"weight":[89,72,62,68,79,81]
})
data
我們看下數據類型:前面4個都是字符類型,後面的3個數值型
map
假設我們現在有個這樣的需求:因爲有時候處理數據的時候必須使用數值型數據,將上面數據的性別這欄中的男替換成1,女替換成0。
該如何實現呢?
方法1:循環
如果你不想搞得那麼複雜:通過循環判斷性別的男女,然後直接賦值來實現。
每次操作之前,我們先生成一個模擬數據的副本,不破壞原始數據
寫個循環進行賦值:
方法2:map實現
循環的方法就是比較容易理解,寫起來更方便;但是當我們的數據量過大的時候,循環就會太慢啦。使用map如何實現?
還是先生成一個副本:
1、通過字典的映射關係
2、寫個函數傳給map
map使用小結:使用字典或者函數傳遞給map方法,它都會對傳入的數據逐個當做參數傳入到字典或者函數中,然後得到映射的值
apply
apply方法在使用的時候和map是比較類似的,只不過apply更全、更強大,它能夠傳入更爲複雜的函數,通過例子來講解下。
參數
DataFrame.apply(
func, # 待執行的函數
axis=0, # 沿着哪個軸操作,默認是0-index,1-column
raw=False, # 是否轉成numpy的ndarray數組進行操作,默認是false
result_type=None, # expand’, ‘reduce’, ‘broadcast’, None # 當axis=1執行,對列屬性名進行操作
args=(), # 兩個可選參數
**kwargs)
進行操作之前還是先生成一個副本data3:
傳入不同函數
在apply方法中我們可以傳入各種不同的函數:
- 自定義函數
- python匿名函數
- python自帶函數
- pandas自帶函數
1、自定義函數
我們傳入自定義函數:上面的改變性別表示方法的函數
假設上面的年齡age都是實歲,我們想看每個人的虛歲,也就是給年齡加上1(age+1),該如何處理?
2、python的匿名函數:lambda
3、python自帶函數
我們傳入的是python自帶的len函數,求解每個字符串的長度:
4、pandas自帶函數
我們模擬數據的時候,字段birthday是字符類型,現在我們使用pandas中自帶的函數轉成時間相關的數據類型:
轉化前
轉化後
指定軸
可以指定axis參數,表示根據哪個軸進行操作,默認是axis=0,列方向上
爲了說明這個參數,我們在模擬一個簡單的數據:
從默認情況、axis=0、axis=1進行對比:
看看過Excel中的效果:
result_type
主要是對新生成的DataFrame的列名進行操作,且只能在axis=1上進行操作,3種取值情況:
- expand
- broadcast
- reduce
1、使用result_type="expand"
2、使用result_type="broadcast"
列名保持不變化
3、使用result_type="reduce"
最終生成的是一個Series類型的數據
applymap
applymap的使用具有一定的限制性,它是針對DataFrame的每個數據執行相同的操作。
DataFrame.applymap(func, na_action=None, **kwargs)
爲了說明,模擬一份簡單的數據:
可以看到,上面的數據都是一個類型float64。
每個數據加1
每個數據保留3位小數
格式化輸出數據:每個數據保留3位小數
改變數據類型
上面的模擬數據df的數據類型是float64,現在將它們統一轉成str類型:
缺失值處理
如果數據中存在缺失值,使用na_action參數來處理:
總結
對數據的行、列進行同一個操作十分常見,本文結合各種例子進行了講解:
- map:能夠滿足絕大部分Series類型數據的同一個操作
- apply:map的功能都能夠實現,比較靈活,能夠傳入各種複雜或者自帶的函數進行數據處理
- applymap:對DataFrame中的數據執行同一個操作,使用較少