網站首頁 編程語言 正文
導讀:pandas中最常用的數據結構是DataFrame,而DataFrame相較于嵌套list或者二維numpy數組更好用的原因之一在于其提供了行索引和列名。本文主要介紹行索引的幾種變換方式,包括rename與reindex、index.map、set_index與reset_index、stack與unstack等。
慣例開局一張圖
01 索引簡介與樣例數據
Series和DataFrame是pandas中的主要數據結構類型(老版本中曾有三維數據結構Panel,是DataFrame的容器,后被取消),而二者相較于傳統的數組或list而言,最大的便利之處在于其提供了索引,DataFrame中還有列標簽名,這些都使得在操作一行或一列數據中非常方便,包括在數據訪問、數據處理轉換等。關于索引的詳細介紹可參考前文:python數據科學系列:pandas入門詳細教程。
這里,為了便于后文舉例解釋,給出基本的DataFrame樣例數據如下:
后文將以此作為操作對象,針對索引的幾種常用變換進行介紹。
注:這里的索引應廣義的理解為既包擴行索引,也包括列標簽。
02 reindex和rename
學習pandas之初,reindex和rename容易使人混淆的一組接口,就其具體功能來看:
- reindex執行的是索引重組操作,接收一組標簽序列作為新索引,既適用于行索引也適用于列標簽名,重組之后索引數量可能發生變化,索引名為傳入標簽序列
- rename執行的是索引重命名操作,接收一個字典映射或一個變換函數,也均適用于行列索引,重命名之后索引數量不發生改變,索引名可能發生變化
另外二者執行功能和接收參數的套路也是很為相近的,均支持兩種變換方式:
- 一種是變換內容+axis指定作用軸(可選0/1或index/columns);
- 另一種是直接用index/columns關鍵字指定作用軸
具體而言,reindex執行索引重組操作,以新接收的一組標簽序列作為索引,當原DataFrame中存在該索引時則提取相應行或列,否則賦值為空或填充指定值。對于前面介紹的示例數據df,以重組行索引為例,兩種可選方式為:
注意到原df中行索引為[1, 3, 5],而新重組的目標索引為[1, 2, 3],其中[1, 3]為已有索引直接提取,[2, 4]在原df中不存在,所以填充空值;同時,原df中索引[5]由于不在指定索引中,所以遭舍棄。進一步地,由于重組后可能存在空值,reindex提供了填充空值的可選參數fill_value和method,二者用法與fillna方法一致,前者用于指定固定值填充,后者用于指定填充策略,例如:
rename用法套路與reindex很為相近,但執行功能完全不同,主要用于執行索引重命名操作,接收一個字典或一個重命名規則的函數類型,示例如下:
03 index.map
針對DataFrame中的數據,pandas中提供了一對功能有些相近的接口:map和apply,以及applymap,其中map僅可用于DataFrame中的一列(也即即Series),可接收字典或函數完成單列數據的變換;apply既可用于一列(即Series)也可用于多列(即DataFrame),但僅可接收函數作為參數,當作用于Series時對每個元素進行變換,作用于DataFrame時對其中的每一行或每一列進行變換;而applymap則僅可作用于DataFrame,且作用對象是對DataFrame中的每個元素進行變換。也就是說,三者的最大不同在于作用范圍以及變換方式的不同。
實際上,apply和map還有一個細微區別在于:同樣是可作用于單列對象,apply適用于索引這種特殊的單列,而map則不適用。所以,對索引執行變換的另一種可選方式是用map函數,其具體操作方式與DataFrame常規map操作一致,接收一個函數作為參數即可:
04 set_index與reset_index
set_index和reset_index是一對互逆的操作,其中前者用于置位索引——將DataFrame中某一列設置為索引,同時丟棄原索引;而reset_index用于復位索引——將索引加入到數據中作為一列或直接丟棄,可選drop參數。二者是非常常用的一組操作,例如在執行groupby操作后一般會得到一個series類型,此時增加一個reset_index操作即可實現series轉換為DataFrame。當然轉換的操作不止這一種。
05 stack與unstack
這也是一對互逆的操作,其中stack原義表示堆疊,實現將所有列標簽堆疊到行索引中;unstack即解堆,用于將復合行索引中的一個維度索引平鋪到列標簽中。實際上,二者的操作即是SQL中經典的行轉列與列轉行,也即在長表與寬表之間轉換。
當然,實現unstack操作的方式還有pivot,此處不再展開。
原文鏈接:https://blog.csdn.net/weixin_43841688/article/details/109542355
相關推薦
- 2022-10-25 laravel-admin對表單的radio屬性無法進行rule(‘required‘)驗證
- 2022-04-14 android studio不顯示當前手機app進程
- 2022-05-21 通過StatefulSet部署有狀態服務應用實現方式_服務器其它
- 2023-03-29 Pytorch損失函數torch.nn.NLLLoss()的使用_python
- 2022-09-29 關于numpy兩個array疊加操作詳解_python
- 2023-04-13 react native 配置路徑別名alias
- 2022-10-01 C#?TreeView控件使用技巧匯總_C#教程
- 2023-03-22 Redis慢查詢日志及慢查詢分析詳解_Redis
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支