3個超實用的Pandas寶藏函數

皮大大 2021-08-15 21:13:54 阅读数:635

本文一共[544]字,预计阅读时长:1分钟~
pandas

大家好,我是Peter~

在此祝大家七夕快樂呀️

3個Pandas中的寶藏函數

在利用Pandas進行數據處理的時候,我們經常需要對某行或者某列的數據、甚至是全部的元素執行某個相同的操作。

Pandas中的mapapplyapplymap就可以解决絕大部分這樣的數據處理需求,讓你不再重複操作。本文結合具體的例子來講解如何使用這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中的數據執行同一個操作,使用較少
版权声明:本文为[皮大大]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815211248110J.html