首頁 > 軟體

詳解Pandas的三大利器(map,apply,applymap)

2022-02-25 13:00:11

實際工作中,我們在利用 pandas進行資料處理的時候,經常會對資料框中的單行、多行(列也適用)甚至是整個資料進行某種相同方式的處理,比如將資料中的 sex欄位將 男替換成1,女替換成0。

在這個時候,很容易想到的是 for迴圈。用 for迴圈是一種很簡單、直接的方式,但是執行效率很低。本文中介紹了 pandas中的三大利器: map、apply、applymap 來解決上述同樣的需求。

  • map
  • apply
  • applymap

模擬資料

通過一個模擬的資料來說明3個函數的使用,在這個例子中學會了如何生成各種模擬資料。資料如下:

import pandas as pd
import numpy as np

boolean = [True, False]
gender = ["男","女"]
color = ["white","black","red"]

# 好好學習如何生成模擬資料:非常棒的例子
# 學會使用random模組中的randint方法

df = pd.DataFrame({"height":np.random.randint(160,190,100),
                     "weight":np.random.randint(60,90,100),
                     "smoker":[boolean[x] for x in np.random.randint(0,2,100)],
                     "gender":[gender[x] for x in np.random.randint(0,2,100)],
                     "age":np.random.randint(20,60,100),
                     "color":[color[x] for x in np.random.randint(0,len(color),100)]
                    })
df.head()

1、map

demo

map() 會根據提供的函數對指定序列做對映。

第一個引數 function 以引數序列中的每一個元素呼叫 function 函數,返回包含每次 function 函數返回值的新列表。

map(function, iterable)

實際資料

將gender中男變成1,女變成0

# 方式1:通過字典對映實現
dic = {"男":1, "女":0}  # 通過字典對映
df1 = df.copy()   # 副本,不破壞原來的資料df
df1["gender"] = df1["gender"].map(dic)
df1

# 方式2:通過函數實現
def map_gender(x):
    gender = 1 if x == "男" else 0
    return gender

df2 = df.copy()
# 將df["gender"]這個S型資料中的每個數值傳進去
df2["gender"] = df2["gender"].map(map_gender)
df2

2、apply

apply方法的作用原理和 map方法類似,區別在於 apply能夠傳入功能更為複雜的函數,可以說 apply是 map的高階版

pandas 的 apply() 函數可以作用於 Series 或者整個 DataFrame,功能也是自動遍歷整個 Series 或者 DataFrame, 對每一個元素執行指定的函數。

在 DataFrame物件的大多數方法中,都會有 axis這個引數,它控制了你指定的操作是沿著0軸還是1軸進行。 axis=0代表操作對 列columns進行, axis=1代表操作對 行row進行

demo

上面的資料中將age欄位的值都減去3,即加上-3

def apply_age(x,bias):
    return x + bias

df4 = df.copy()
# df4["age"]當做第一個值傳給apply_age函數,args是第二個引數
df4["age"] = df4["age"].apply(apply_age,args=(-3,))

計算BMI指數

# 實現計算BMI指數:體重/身高的平方(kg/m^2)
def BMI(x):
    weight = x["weight"]
    height = x["height"] / 100
    BMI = weight / (height **2)

    return BMI

df5 = df.copy()
df5["BMI"] = df5.apply(BMI,axis=1)  # df5現在就相當於BMI函數中的引數x;axis=1表示在列上操作
df5

DataFrame型資料的 apply操作總結:

  1. 當 axis=0時,對 每列columns執行指定函數;當 axis=1時,對 每行row執行指定函數。
  2. 無論 axis=0還是 axis=1,其傳入指定函數的預設形式均為 Series,可以通過設定 raw=True傳入 numpy陣列。
  3. 對每個Series執行結果後,會將結果整合在一起返回(若想有返回值,定義函數時需要 return相應的值)

apply實現需求

通過apply方法實現上面的性別轉換需求。apply方法中傳進來的第一個引數一定是函數

3、applymap

DF資料加1

applymap函數用於對DF型資料中的每個元素執行相同的函數操作,比如下面的加1:

保留2位有效數位

到此這篇關於詳解Pandas的三大利器(map,apply,applymap)的文章就介紹到這了,更多相關Pandas map apply applymap內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com