pandas中的3個寶藏函數

3個Pandas的寶藏函數

大家好,我是Peter呀~

在利用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中的數據執行同一個操作,使用較少
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章