【AI Study】第四天,Pandas(9)- 進階主題

文章概要

本文詳細介紹 Pandas 的進階主題,包括:

  • 自定義函數
  • 高級索引
  • 數據導出
  • 實際應用示例

自定義函數

函數應用

# 基本函數應用
def calculate_bonus(salary, performance):"""計算獎金Args:salary (float): 基本工資performance (float): 績效分數 (0-1)Returns:float: 獎金金額"""return salary * performance * 0.1# 應用到 DataFrame
df['bonus'] = df.apply(lambda x: calculate_bonus(x['salary'], x['performance']),axis=1
)# 使用 applymap 應用到所有元素
def format_currency(x):"""格式化貨幣Args:x (float): 金額Returns:str: 格式化后的金額"""return f"${x:,.2f}"df = df.applymap(format_currency)# 使用 transform 保持索引
def normalize_column(x):"""標準化列Args:x (pd.Series): 輸入序列Returns:pd.Series: 標準化后的序列"""return (x - x.mean()) / x.std()df['normalized_value'] = df.groupby('category')['value'].transform(normalize_column)

函數映射

# 使用 map 進行值映射
category_map = {'A': 'High','B': 'Medium','C': 'Low'
}df['category_level'] = df['category'].map(category_map)# 使用 replace 進行值替換
df['status'] = df['status'].replace({'active': 1,'inactive': 0,'pending': -1
})# 使用 apply 進行復雜映射
def map_complex_value(row):"""復雜值映射Args:row (pd.Series): 行數據Returns:str: 映射后的值"""if row['age'] < 18:return 'Minor'elif row['age'] < 65:return 'Adult'else:return 'Senior'df['age_group'] = df.apply(map_complex_value, axis=1)

函數優化

# 使用 numba 優化函數
from numba import jit@jit(nopython=True)
def calculate_statistics(values):"""計算統計量Args:values (np.array): 數值數組Returns:tuple: (均值, 標準差)"""mean = 0.0for x in values:mean += xmean /= len(values)std = 0.0for x in values:std += (x - mean) ** 2std = (std / len(values)) ** 0.5return mean, std# 使用向量化操作
def vectorized_calculation(df):"""向量化計算Args:df (pd.DataFrame): 輸入數據Returns:pd.DataFrame: 計算結果"""# 使用 numpy 的向量化操作df['result'] = np.where(df['value'] > df['threshold'],df['value'] * 1.1,df['value'] * 0.9)return df# 使用并行處理
from multiprocessing import Pooldef parallel_process(df, func, n_cores=4):"""并行處理Args:df (pd.DataFrame): 輸入數據func (function): 處理函數n_cores (int): 核心數Returns:pd.DataFrame: 處理結果"""# 分割數據chunks = np.array_split(df, n_cores)# 創建進程池pool = Pool(n_cores)# 并行處理results = pool.map(func, chunks)# 合并結果return pd.concat(results)

高級索引

多級索引

# 創建多級索引
df = pd.DataFrame({'value': np.random.randn(100),'category': np.random.choice(['A', 'B', 'C'], 100),'subcategory': np.random.choice(['X', 'Y', 'Z'], 100)
})# 設置多級索引
df = df.set_index(['category', 'subcategory'])# 使用多級索引
# 選擇特定類別
df.loc['A']# 選擇特定子類別
df.loc[('A', 'X')]# 使用 xs 進行交叉選擇
df.xs('X', level='subcategory')# 重置索引
df = df.reset_index()# 使用 stack 和 unstack
df_stacked = df.stack()
df_unstacked = df.unstack()

索引操作

# 設置索引
df = df.set_index('date')# 重置索引
df = df.reset_index()# 重命名索引
df.index.name = 'date'
df.index = df.index.rename('date')# 索引排序
df = df.sort_index()# 索引對齊
df1 = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
df2 = pd.DataFrame({'B': [4, 5, 6]}, index=['b', 'c', 'd'])
df_aligned = df1.align(df2, join='outer')# 索引轉換
df.index = pd.to_datetime(df.index)

索引優化

# 檢查索引是否唯一
is_unique = df.index.is_unique# 檢查索引是否單調
is_monotonic = df.index.is_monotonic# 檢查索引是否已排序
is_sorted = df.index.is_monotonic_increasing# 優化索引
def optimize_index(df):"""優化索引Args:df (pd.DataFrame): 輸入數據Returns:pd.DataFrame: 優化后的數據"""# 檢查索引類型if isinstance(df.index, pd.DatetimeIndex):# 確保索引已排序if not df.index.is_monotonic:df = df.sort_index()# 檢查索引是否連續if not df.index.is_monotonic_increasing:df = df.reindex(pd.date_range(df.index.min(),df.index.max(),freq='D'))return df# 使用示例
df = pd.DataFrame({'value': np.random.randn(100)
}, index=pd.date_range('2023-01-01', periods=100))# 優化索引
df = optimize_index(df)

數據導出

格式轉換

# 導出為 CSV
df.to_csv('output.csv', index=False)# 導出為 Excel
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)# 導出為 JSON
df.to_json('output.json', orient='records')# 導出為 SQL
from sqlalchemy import create_engine
engine = create_engine('sqlite:///database.db')
df.to_sql('table_name', engine, if_exists='replace')# 導出為 HTML
df.to_html('output.html')# 導出為 Markdown
df.to_markdown('output.md')

數據壓縮

# 使用 gzip 壓縮
df.to_csv('output.csv.gz', compression='gzip', index=False)# 使用 zip 壓縮
df.to_csv('output.csv.zip', compression='zip', index=False)# 使用 bz2 壓縮
df.to_csv('output.csv.bz2', compression='bz2', index=False)# 使用 xz 壓縮
df.to_csv('output.csv.xz', compression='xz', index=False)# 自定義壓縮函數
def compress_data(df, output_file, compression='gzip'):"""壓縮數據Args:df (pd.DataFrame): 輸入數據output_file (str): 輸出文件路徑compression (str): 壓縮方式"""df.to_csv(output_file, compression=compression, index=False)

批量處理

# 批量導出
def batch_export(df, output_dir, chunk_size=10000):"""批量導出數據Args:df (pd.DataFrame): 輸入數據output_dir (str): 輸出目錄chunk_size (int): 塊大小"""# 創建輸出目錄import osos.makedirs(output_dir, exist_ok=True)# 分塊導出for i, chunk in enumerate(np.array_split(df, len(df) // chunk_size + 1)):output_file = os.path.join(output_dir, f'chunk_{i}.csv')chunk.to_csv(output_file, index=False)# 批量轉換格式
def batch_convert(input_dir, output_dir, input_format='csv', output_format='excel'):"""批量轉換格式Args:input_dir (str): 輸入目錄output_dir (str): 輸出目錄input_format (str): 輸入格式output_format (str): 輸出格式"""# 創建輸出目錄import osos.makedirs(output_dir, exist_ok=True)# 獲取輸入文件列表input_files = [f for f in os.listdir(input_dir) if f.endswith(f'.{input_format}')]# 轉換每個文件for input_file in input_files:# 讀取輸入文件input_path = os.path.join(input_dir, input_file)df = pd.read_csv(input_path)# 生成輸出文件名output_file = os.path.splitext(input_file)[0] + f'.{output_format}'output_path = os.path.join(output_dir, output_file)# 導出文件if output_format == 'excel':df.to_excel(output_path, index=False)elif output_format == 'json':df.to_json(output_path, orient='records')elif output_format == 'csv':df.to_csv(output_path, index=False)

總結

進階主題部分涵蓋了:

  1. 自定義函數(函數應用、函數映射、函數優化)
  2. 高級索引(多級索引、索引操作、索引優化)
  3. 數據導出(格式轉換、數據壓縮、批量處理)
  4. 實際應用示例

掌握這些進階主題對于提升 Pandas 使用水平至關重要,它可以幫助我們:

  • 提高代碼效率
  • 優化數據處理
  • 增強數據導出能力
  • 提升代碼質量

建議在實際項目中注意:

  • 合理使用自定義函數
  • 優化索引操作
  • 選擇合適的導出格式
  • 注意數據壓縮
  • 考慮批量處理
  • 保持代碼可維護性
  • 持續學習新特性

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

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

相關文章

Boost dlib opencv vs2022 C++ 源碼安裝集成配置

?在進行人臉檢測開發時候出現 E1696: 無法打開源文件 "dlib/image_processing/frontal_face_detector.h 解決方案 1, 下載boost 需要:https://www.boost.org/ 或github git clone --recursive https://gitee.com/luozhonghua/boost.git 記住一定要完整版源碼…

rest_framework permission_classes 無效的解決方法

寫了一個特別簡單的view&#xff1a; csrf_exempt login_required() authentication_classes([TokenAuthentication]) permission_classes([IsAdminUser, IsAuthenticated]) def department_management_view(request):if request.method POST:department_name request.POST.…

Windows 體系對比 + 嵌入式開發全流程拆解

一、操作系統層級對比&#xff1a;Windows 家族 vs Linux 家族 角色Windows 體系Linux 體系本質核心內核Windows NT KernelLinux Kernel操作系統引擎&#xff08;管理CPU/內存/硬件&#xff09;完整操作系統Windows 11 Home/ProUbuntu / Debian / CentOS內核 界面 軟件 驅動…

C# 實現 gRPC高級通信框架簡單實現

1. 前言 gRPC&#xff08;Google Remote Procedure Call&#xff09;是一個高性能、開源和通用的RPC框架&#xff0c;由Google主導開發。它支持多種編程語言&#xff0c;并廣泛用于構建分布式應用程序和服務。gRPC基于HTTP/2協議&#xff0c;支持雙向流、請求-響應和多請求-多…

將項目推到Github

前提條件 需要安裝GIT需要注冊GitHub賬號 步驟 首先我們需要登錄我們的GITHUB賬號&#xff0c;然后點擊新建存儲庫 然后起一個名字&#xff0c;設置一些私有公開即可 創建完成之后&#xff0c;這里有可以遠程推送的命令 后面就直接輸出命令即可 之后推送即可 git push orig…

K8S 專欄 —— namespace和Label篇

文章目錄 namespace創建namespacenamespace使用默認namespaceLabel添加Label查詢Labelnamespace 命名空間是一種用于在 kubernetes 集群中劃分資源的虛擬化手段,每個資源都屬于一個命名空間,使得多個團隊或應用可以在同一個集群中獨立運行,避免資源沖突。 創建namespace y…

44.第二階段x64游戲實戰-封包-分析掉落物列表id存放位置

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;43.第二階段x64游戲實戰-封包-代碼實現獲取包裹物品 之前的內容找到了掉落物的…

匯編語言期末快速過手筆記

一、計算機系統組成 計算機系統組成&#xff1a;由硬件系統和軟件系統組成 硬件系統&#xff1a;CPU、存儲器、輸入/輸出設備等物理部件軟件系統&#xff1a;操作系統、各種語言、系統軟件和應用軟件 匯編語言分類 屬于低級語言&#xff08;直接面向硬件&#xff09;與高級語言…

C++相比于C語言增加了哪些概念?

C相比于C語言增加了哪些概念&#xff1f; 作者將狼才鯨創建日期2025-06-17 CSDN閱讀地址&#xff1a;C相比于C語言增加了哪些概念&#xff1f;Gitee源碼目錄&#xff1a;qemu/demo_代碼示例/02_C_Class 目標受眾&#xff1a;熟悉C語言&#xff0c;對C完全不了解&#xff0c;但…

HarmonyOS5 分布式測試:斷網情況支付場景異常恢復驗證

以下是針對HarmonyOS 5分布式事務在斷網支付場景下的異常恢復驗證全流程方案&#xff0c;綜合關鍵技術與測試策略&#xff1a; 一、核心事務機制驗證 ?兩階段提交&#xff08;2PC&#xff09;協議? 模擬支付流程中網絡中斷&#xff0c;驗證事務協調者能否正確處理預提交與回滾…

【狂飆AGI】第5課:前沿技術-文生圖(系列1)

目錄 &#xff08;一&#xff09;繪畫本質&#xff08;二&#xff09;國內外AI轉繪展&#xff08;三&#xff09;創作思路&#xff08;四&#xff09;美學理論&#xff08;1&#xff09;不可能美學&#xff08;2&#xff09;趨無限美學&#xff08;3&#xff09;反物理美學&…

發那科A06B-6290-H124 伺服驅動器

?FANUC A06B-6290-H124 伺服驅動器核心性能解析? ?一、核心控制能力? ?多模式精密控制? 位置控制?&#xff1a;支持高精度旋轉角度/直線位移調節&#xff08;分辨率達脈沖級&#xff09;&#xff0c;適用于數控機床定位&#xff08;誤差0.01mm級&#xff09;和機器人軌…

Spring Boot 項目啟動優化

Spring Boot 項目啟動優化是一個非常重要的話題&#xff0c;尤其是在微服務和云原生環境下&#xff0c;快速啟動意味著更快的部署、更高效的彈性伸縮和更好的開發體驗。 下面我將從分析診斷、優化策略和終極方案三個層面&#xff0c;為你提供一個全面、可操作的優化指南。 一、…

「爬取豆瓣Top250電影的中文名稱」數據采集、網絡爬蟲

- 第 108 篇 - Date: 2025 - 06 - 16 Author: 鄭龍浩&#xff08;仟墨&#xff09; 文章目錄 **任務&#xff1a;爬取豆瓣Tap250電影的中文名稱****代碼****實現效果** 任務&#xff1a;爬取豆瓣Tap250電影的中文名稱 代碼 # 豆瓣前Tap 250 import requests from bs4 import…

MySQL 多表查詢、事務

1.多表查詢的分類 1.1 內連接 在 MySQL 中&#xff0c;內連接&#xff08;INNER JOIN&#xff09;返回的是兩個表中滿足連接條件的記錄的交集。這個“交集”不是指整個表&#xff0c;而是指符合連接條件的行組合&#xff0c;也就是A表和B表中滿足我們使用on指定條件的記錄。圖…

CSP-J 2020 入門級 第一輪(初賽) 答案及解析

CSP-J 2020 入門級 第一輪&#xff08;初賽&#xff09; 答案及解析 在內存儲器中每個存儲單元都被賦予一個唯一的序號&#xff0c;稱為&#xff08;&#xff09;。 A. 地址 B. 序號 C. 下標 D. 編號 答: A 計算機中每個存儲單元都是1字節&#xff0c;都有唯一的地址。 編譯器…

Flutter包管理與插件開發完全指南

Flutter作為Google推出的跨平臺移動應用開發框架&#xff0c;其強大的生態系統離不開完善的包管理機制和豐富的插件支持。本文將全面介紹Flutter中的包管理體系和插件開發實踐&#xff0c;幫助開發者高效管理項目依賴并擴展應用功能。 一、Flutter包管理基礎 1.1 包管理概述 …

【視頻直播出海】阿里云ApsaraVideo Live:從零搭建全球直播平臺的“星際航行”指南!

【視頻直播出海】阿里云ApsaraVideo Live&#xff1a;從零搭建全球直播平臺的“星際航行”指南&#xff01; 在全球化浪潮的推動下&#xff0c;視頻直播行業正以前所未有的速度跨越國界&#xff0c;成為連接世界的“數字新橋梁”。對于渴望拓展海外市場的企業而言&#xff0c;…

OAuth2中的Token

兩個不同的Token OAuth2 中主要有兩個不同的Token, 其中的區別為是否與用戶相關聯, 即與用戶相關的用戶Token, 和與客戶端相關的客戶端Token, 可以通過用戶Token, 查詢到用戶的相關信息, 客戶端Token與用戶無關, 一般只用于客戶端認證 用戶Token 獲取用戶Token一般有兩個方式…

使用 FastMCP 實現 Word 文檔與 JSON 數據互轉的 Python 服務

一、項目背景 本文分享一個基于 FastMCP 框架實現的文檔處理服務&#xff0c;可實現 Word 文檔&#xff08;.docx&#xff09;與 JSON 數據格式的雙向轉換。通過此服務&#xff0c;開發者可以輕松實現文檔內容提取、結構化數據填充、樣式模板復用等功能&#xff0c;適用于自動…