數據處理與統計分析 —— apply自定義函數

目錄

一、向量化與偽向量化

1、向量化

2、np.vectorize 偽向量化(特定場景)

3、apply(自定義函數)

二、apply函數

1、對series中使用apply

2、對dataframe中使用apply

3、apply函數案例-泰坦尼克號數據集]

數據集下載鏈接:

鏈接:https://pan.quark.cn/s/2598999d11dd?pwd=Xx7N
提取碼:Xx7N

一、向量化與偽向量化

????????在pandas中,向量化操作指的是直接在整個數組上執行操作,而不是循環遍歷每個元素,這些操作底層是由高效的c代碼實現的,并且利用了現代的cpu的SIMD指令(單指令多數據流),向量化操作在pandas和numpy中非常常見。

1、向量化

? ? ? ? (1)操作示例

import pandas as pd
df = pd.DataFrame({'A':[1,2,3], 'B':[4,5,6]]})
df['C'] = df['A'] + df['B'] # 列與列相加
df['D'] = df['A'] * 10      # 列乘以標量
df['E'] = np.log(df['A'])   # 使用numpy的log函數作用于整列

? ? ? ? (2)向量化特點:

????????????????????????極高性能:比循環快100-1000倍

????????????????????????簡潔的語法:類似于數學公式的表達方式

????????????????????????廣泛的支持:數學、統計、字符串、日期等操作

2、np.vectorize 偽向量化(特定場景)

????????np.vectorize是一個將普通的python函數轉換成能夠處理numpy數組的函數(偽向量化函數),注意:它不是真正的向量化,底層仍然是循環遍歷每個元素,只是實現了一種方便的接口。可以使我們可以像向量化函數一樣去調用它。

????(1)np.vectorize 偽向量化特點:

????????????????偽向量化:內部仍然是python循環,僅提供了向量化接口

????????????????性能比純循環快2-5倍左右,但是比真正的向量化慢10-100倍

????????????????優勢在于簡化了代碼結構

? ? ? (2)使用場景:

????????????????場景1:當需要一個自定義標量函數應用到數組的每個元素,且該函數無法用pandas/numpy內置函數直接表示時。
? ? ? ? ? ? ? ? 例如:我們有一個復雜的函數,包含了多個條件的分支

def my_fun(x):
if x < 0:return 0
elif 0 <= x < 1:return x ** 2
else:return 2*x - 1# 使用np.vectorize
vfunc = np.vectorize(my_fun)# 應用在series
s = pd.Series([-0.5, 0.3, 0.9, 1.5, 2.0])
result = vfunc(s) # 返回:[0, 0.09, 0.81, 2.0, 3.0]

????????????????場景2:當函數有多個參數(其中有一些函數需要固定)時

def my_fun2(x, a, b):return a * x + b
# 需要固定a和b的值,只有x向量化
vfunc2 = np.vectorize(my_fun2, excluded=['a', 'b']))

3、apply(自定義函數)

apply()函數是pandas的方法,沿著dataFrame的軸(行或者列)應用自定義函數

? ? ? ? 特點:
? ? ? ? ? ? 靈活:既可以處理行又可以處理列
? ? ? ? ? ? 性能比較低:本質上是循環操作

性能:向量化函數>偽向量化函數>apply(自定義函數)

二、apply函數

????????apply函數是pandas中自由度(自定義)最高的函數之一,用來對series、dataframe或者分組對象應用自定義函數。
核心行為:
? ? 1:對series,逐個元素進行處理(輸入單個值,輸出單個值)
? ? 2:對dataframe,按照行(axis=1)或者列(axis=0)傳遞數據(輸入整行/整列數據,輸出結果)
? ? 3:對groupby對象,處理每個分組(輸入分組子集,輸出聚合結果)
核心作用:替代循環,實現批量處理,代碼簡介高效。
特點:逐行處理

1、對series中使用apply

需求:自定義函數my_fun1(),實現接受series對象,然后將接收到的每一個元素,計算其平方結果

def my_fun1(x):return x ** 2s = pd.Series([1,2,3,4])
r1 = s.apply(my_fun1)
print(r1)

輸出結果:
0???? 1
1???? 4
2???? 9
3??? 16
dtype: int64

需求:自定義函數my_fun2(),接受傳入參數的函數,例如:my_fun2(x, e)

def my_fun2(x, e):return x ** er2 = s.apply(my_fun2, e=3)
print(r2)

0 ? ? 1
1 ? ? 8
2 ? ?27
3 ? ?64
dtype: int64

2、對dataframe中使用apply

????????series的apply函數調用自定義函數,自定義函數接收到是數組中的每個元素,df接收到的是一整行或者整列

#1:創建df對象,創建兩個列
df = pd.DataFrame({'a':[10,20,30], 'b': [20,30,40]})
print(df.head())# 2:創建自定義函數my_fun3(), 作用于df對象
def my_fun3(x):print(f"x的內容:\n{x}")print(f"x的類型:{type(x)}")# 直接調用上述的my_fun3(),作用于df對象
# 不需要接受返回值輸出,因為這個自定義函數沒有返回值
df.apply(my_fun3)   # 默認是按照列輸出
df.apply(my_fun3, axis=0)   # axis值為0,就是按照列輸出
df.apply(my_fun3, axis=1)   # axis值為1,就是按照行輸出

3、apply函數案例-泰坦尼克號數據集

import pandas as pd
df = pd.read_csv("data/titanic_train.csv")# 需求1:自定義函數,分別計算泰坦尼克號數據集某列的缺失值的個數,某列的缺失值占比,某列的非缺失值占比
# pd.isnull
def count_missing(vec):# vec就是接受到dfs對象的某列或者某行數據(要么是一整行數據要么是一整列數據)return pd.isnull(vec).sum() # 對傳入的一整行或者一整列,計算缺失值的數量# 某列的缺失值占比
def prop_missing(vec):# 缺失值的占比公式:某列的缺失值數量/某列的元素的總個數return pd.isnull(vec).sum() / vec.size# 某列的非缺失值占比
def prop_complete(vec):return 1-prop_missing(vec)# 測試上面的函數
# 默認:axis=0, 即:以列的方式傳入的
print(f"以列的形式傳入,計算某列的缺失值個數:\n{df.apply(count_missing)}") # 計算的是所有的列,沒有指定某個列,所有列中缺失值的數量
print(f"以列的形式傳入,計算某列的缺失值占比:\n{df.apply(prop_missing)}")
print(f"以列的形式傳入,計算某列的非缺失值占比:\n{df.apply(prop_complete)}")# 默認:axis=1, 即:以行的方式傳入的
print(f"以行的形式傳入,計算某行的缺失值個數:\n{df.apply(count_missing, axis=1)}") # 計算的是所有的列,沒有指定某個列,所有列中缺失值的數量
print(f"以行的形式傳入,計算某列的缺失值占比:\n{df.apply(prop_missing, axis=1)}")
print(f"以行的形式傳入,計算某列的非缺失值占比:\n{df.apply(prop_complete, axis=1)}")

計算某列的缺失值個數:PassengerId ? ? ?0
Survived ? ? ? ? 0
Pclass ? ? ? ? ? 0
Name ? ? ? ? ? ? 0
Sex ? ? ? ? ? ? ?0
Age ? ? ? ? ? ?177
SibSp ? ? ? ? ? ?0
Parch ? ? ? ? ? ?0
Ticket ? ? ? ? ? 0
Fare ? ? ? ? ? ? 0
Cabin ? ? ? ? ?687
Embarked ? ? ? ? 2
dtype: int64

計算某列的缺失值占比:PassengerId ? ?0.000000
Survived ? ? ? 0.000000
Pclass ? ? ? ? 0.000000
Name ? ? ? ? ? 0.000000
Sex ? ? ? ? ? ?0.000000
Age ? ? ? ? ? ?0.198653
SibSp ? ? ? ? ?0.000000
Parch ? ? ? ? ?0.000000
Ticket ? ? ? ? 0.000000
Fare ? ? ? ? ? 0.000000
Cabin ? ? ? ? ?0.771044

Embarked ? ? ? 0.002245
dtype: float64
計算某列的非缺失值占比:PassengerId ? ?1.000000
Survived ? ? ? 1.000000
Pclass ? ? ? ? 1.000000
Name ? ? ? ? ? 1.000000
Sex ? ? ? ? ? ?1.000000
Age ? ? ? ? ? ?0.801347
SibSp ? ? ? ? ?1.000000
Parch ? ? ? ? ?1.000000
Ticket ? ? ? ? 1.000000
Fare ? ? ? ? ? 1.000000
Cabin ? ? ? ? ?0.228956
Embarked ? ? ? 0.997755
dtype: float64

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93858.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何有效利用大語言模型來智能加速產業聯盟的產業鏈轉化路徑?

觀點作者&#xff1a;科易網AI技術轉移研究院在科技創新浪潮席卷全球的今天&#xff0c;科技成果轉化已成為衡量一個國家創新能力的重要標志。然而&#xff0c;一項權威調查顯示&#xff0c;我國科技成果轉化率不足30%&#xff0c;大量有價值的創新成果仍停留在實驗室階段&…

視頻加水印 視頻加水印軟件 視頻加動態水印

如果你有一個視頻&#xff0c;你想給他加一個水印&#xff0c;那么你可以使用這個工具&#xff0c;準備好你的視頻和水印。水印一般采用PNG&#xff0c;打開這個工具&#xff0c;把你的視頻和水印拖進這個方框當中。視頻限制是MP4&#xff0c;水印限制是PNG&#xff0c;它可以把…

面向DeepSeek chat coding實錄(二)

向DeepSeek的提問 幫我設計以下兩個python class Span 屬性&#xff1a; hash值&#xff08;在init函數中通過時間初始化&#xff09; 創建時間&#xff1a;時間&#xff08;在init函數中通過時間初始化&#xff09; 結束時間&#xff1a;時間&#xff08;可選&#xff0c;默認…

Hi3516CV610-00S 海思SOC芯片 可申請開發資料

1.1 概述Hi3516CV610 是一顆應用在安防市場的 IPC SoC。在開放操作系統、新一代視頻編解碼標準、網絡安全和隱私保護、人工智能方面引領行業發展&#xff0c;主要面向室內外場景下的槍機、球機、半球機、海螺機、槍球一體機、雙目長短焦機等產品形態&#xff0c;打造極具競爭力…

算法題Day4

目錄 13. 練習13 : 整數十位 14. 練習14 : 時間轉換 15. 練習15 : 小雨的游泳時間 13. 練習13 : 整數十位 解題方法: #include <iostream> using namespace std; int a; int main() {cin >> a;cout << a % 100 / 10 << endl;return 0; } 14. 練習…

加速你的故障排查:使用 Elasticsearch 構建家電手冊的 RAG 應用

作者&#xff1a;來自 Elastic Alessandro Brofferio 學習如何使用 Elasticsearch 構建 RAG 應用&#xff0c;輕松排查你的家電問題。 想要獲得 Elastic 認證嗎&#xff1f;來看看下一次 Elasticsearch 工程師培訓什么時候開始吧&#xff01; Elasticsearch 擁有大量新功能&am…

6.Shell腳本修煉手冊---grep命令使用指南

grep 命令&#xff1a;從文本中精準篩選信息的實用指南 文章目錄grep 命令&#xff1a;從文本中精準篩選信息的實用指南一、什么是 grep&#xff1f;為什么要用它&#xff1f;二、grep 基本語法三、常用選項詳解&#xff08;附實例&#xff09;&#xff08;一&#xff09;模式選…

Python day51

浙大疏錦行 Python day51 復習日&#xff0c;DDPM class DenoiseDiffusion():def __init__(self, eps_model: nn.Module, n_steps: int, device: torch.device):super().__init__()self.eps_model eps_modelself.n_steps n_stepsself.device deviceself.beta torch.linsp…

數據結構:生成 (Generating) 一棵 AVL 樹

目錄 搭建“創世”的舞臺 注入序列&#xff0c;觀察演化 注入 10 注入 20 注入 30 注入 40 注入 50 注入 25 再次審視 上一講&#xff0c;我們已經從最根本的邏輯出發&#xff0c;推導出了 AVL 樹失衡時所必需的修復操作——旋轉 (Rotation)。 現在&#xff0c;我們將…

github 上傳代碼步驟

登錄GitHub → 點擊右上角 ?? → New Repository??。填寫倉庫名稱&#xff08;建議與本地項目同名&#xff09;&#xff0c;選擇 ??Public/Private??。??關鍵&#xff1a;不要勾選?? “Initialize with README”&#xff08;避免與本地倉庫沖突&#xff09;。點擊 …

陪診小程序系統開發:開啟智慧就醫新時代

在數字化浪潮的推動下&#xff0c;智慧醫療正逐漸成為現實。陪診小程序系統的開發&#xff0c;作為智慧醫療領域的一次重要創新&#xff0c;正以其獨特的魅力與優勢&#xff0c;引領著就醫新時代的到來。它不僅改變了傳統就醫模式&#xff0c;更以科技的力量&#xff0c;讓醫療…

朝花夕拾(七)--------從混淆矩陣到分類報告全面解析?

目錄 ??機器學習模型評估指南&#xff1a;從混淆矩陣到分類報告全面解析?? ??1. 引言?? ??2. 混淆矩陣&#xff1a;模型評估的基石?? ??2.1 什么是混淆矩陣&#xff1f;?? 2.2二分類問題的混淆矩陣 ??二分類場景下的具體案例? ?分析案例: 1.??案例…

Python讀取和設置PNG圖片的像素值

在Python中&#xff0c;可以使用Pillow庫或OpenCV庫來讀取和寫入PNG圖片的像素值。以下是兩種方法的詳細說明&#xff1a;1. 使用Pillow庫Pillow是Python中常用的圖像處理庫&#xff0c;支持多種圖像格式&#xff0c;包括PNG。讀取像素值from PIL import Imageimg Image.open(…

SkyWalking + Elasticsearch8 容器化部署指南:國內鏡像加速與生產級調優

SkyWalking Elasticsearch8 Docker 部署文檔本文提供在 Ubuntu 服務器上&#xff0c;使用 Docker Compose 部署 SkyWalking&#xff08;OAPUI&#xff09;與 Elasticsearch 8 的完整步驟&#xff0c;數據/日志落地到 /media/disk2 前置條件 Ubuntu&#xff0c;已具備 sudo 權限…

有符號和無符號的區別

有符號&#xff08;Signed&#xff09;和無符號&#xff08;Unsigned&#xff09;是計算機編程中用來描述整數數據類型能否表示負數的兩個概念。它們的主要區別在于能否表示負數以及數值的表示范圍。以下是它們的核心區別&#xff1a;1. 能否表示負數有符號&#xff08;Signed&…

8月21日作業

1、Makefile中頭文件發生過修改的解決&#xff1a; 處插入*.h依賴&#xff0c;對.h文件打的時間戳進行檢查2、頭刪和輸出//五、頭刪 void delete_head(seq_p s) {empty(s);for(int i1;i<s->len;i){s->data[i-1]s->data[i];}s->len--; }//六、輸出 void output(s…

Lucene 8.5.0 的 `.pos` 文件**邏輯結構**

Lucene 8.5.0 的 .pos 文件**邏輯結構**&#xff08;按真實實現重新整理&#xff09; .pos 文件 ├─ Header (CodecHeader) ├─ TermPositions TermCount ← 每個 term 一段&#xff0c;順序由詞典隱式決定 │ ├─ PackedPosDeltaBlock N ← 僅當 **無 payl…

基于Matlab多技術融合的紅外圖像增強方法研究

紅外圖像在低照度、強干擾和復雜環境下具有較強的成像能力&#xff0c;但受傳感器噪聲、成像條件及大氣衰減等因素影響&#xff0c;原始紅外圖像往往存在對比度低、細節模糊及光照不均等問題。本文針對紅外圖像質量退化的特點&#xff0c;提出了一種基于多算法融合的紅外圖像增…

【時時三省】集成測試 簡介

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省 目錄 1,集成測試含義 2,集成測試 驗證方法 3,集成測試 用例設計方法 4,集成測試輸出物 5,集成測試注意點 1,集成測試含義 單元測試在以V模型的流程中,對應的是架構設計階段。在 單元測試 和 架構設計…

leetcode 76 最小覆蓋子串

一、題目描述二、解題思路整體思路&#xff1a;模擬尋找最小覆蓋子集的過程&#xff0c;由于可借助同向雙指針且可以做到指針不回退&#xff0c;所以可以用滑動窗口的思想來解決這個問題。具體思路&#xff1a;(1)數組hash1用于統計t中每一個字符出現的頻次&#xff0c;變量kin…