左手用R右手Python系列5——數據切片與索引
今天這篇跟大家分享我的R VS Pyhton學習筆記系列5——數據索引與切片。
我之前分享過的所有學習筆記都不是從完全零基礎開始的,因為沒有包含任何的數據結構與變數類型等知識點。
因為一直覺得一門編程語言的對象解釋,特別是數據結構與變數類型,作為語言的核心底層概念,看似簡單,實則貫穿著整門語言的核心思想精髓,所以一直不敢隨便亂講,害怕誤人子弟。還是建議每一個初學者(無論是R語言還是Python,都應該用一門權威的入門書好好學習其中最為基礎的數據結構、變數類型以及基礎語法函數)。
今天我要分享的內容涉及到R語言與Pyhton中所有的索引與切片方法,包含低級方法和高級方法。
R語言:
- 數據框索引:
- 基於數據框本身提取
- subset函數
- filter+select函數
Python:
- 數據框自身的方法
- ix方法
- loc方法
- iloc方法
- query方法
----------------
R語言:
------------------
library(ggplot2)
我使用ggplot2內置的mpg數據集來進行案例演示,數據框可以通過方括弧傳入行列下標的方式篩選各種符合條件的取值範圍。
取列可以直接使用列號,或者使用列名:
mpg[,c(2,3)]mpg[,c("model","displ")]
mpg$model 等價於 mpg[,"model"] #取單列時兩種方法等價,但是第二種方法會自動降維(編程一個向量)。
行切片:(行切片同樣可以使用行號:)
mpg[1:10,]
通常情況下這種取值是沒有任何意義的,行索引最常用的場景是用於條件索引,來基於分類欄位篩選數據子集。
基於數據框本身的條件索引:
mpg[mpg$model=="audi" | mpg$manufacturer=="mercury",] #或條件mpg[mpg$model=="a4" & mpg$manufacturer=="audi",] #且條件
以上索引是在沒有藉助任何外部函數的基礎上,通過數據框自身的規則完成的,很不優雅,因為寫了很多重複的名稱。
一種更優雅的方式是使用subset函數進行行列篩選。
subset(mpg,model=="audi"| manufacturer=="mercury",select=c("model","manufacturer","year"))subset(mpg,model=="a4" & manufacturer=="audi",select=c("model","manufacturer","year"))
subset函數主要接受三個參數,數據框名稱,篩選行,select篩選列。或與且得邏輯表達與上述案例一致。
還有一種更加高級優雅得方式是使用dplyr包中的select和filter函數進行行列索引與切片。
library(dplyr)mpg%>%filter(model=="audi"| manufacturer=="mercury")%>%select(model,manufacturer,year)mpg%>%filter(model=="a4" & manufacturer=="audi")%>%select(model,manufacturer,year)
再高級一點兒的切片與索引方法有木有呢,當然有了,datatable包把所有的數據框索引與切片功能參數全都封裝到了數據框內部,不過鑒於datatable語法對於初學者會引起不適,而且我平時使用的也比較少,只懂一些皮毛,感性的話,可以自行擴展學習,以上切片與索引方式最足夠你完成數據分析工作中的所有切片索引需求。
--------------
Python:
--------------
為了保持與R語言的案例數據演示一致,我把剛才在R語言中使用的數據複製一份導入Python中。
write.table (mpg,"C:/Users/RAINDU/Desktop/mydata.csv",sep=",",row.names=FALSE) #R代碼
import osimport pandas as pdimport numpy as npos.chdir("C:/Users/RAINDU/Desktop/") mydata = pd.read_csv("mydata.csv",sep = ",",encoding = "utf-8")
#數據預覽與描述:
mydata.head()mydata.describe()
Python中提取列的規則與R語言中極其相似:
提取單行的兩種等價方式:
mydata.model #在R語言中應該寫mydata$modelmydata["model"] #在R語言中應該寫mydata[,"model"]或者mydata["model"]
如果是多列則中括弧內指定列名組成的列表:
mydata[["model","manufacturer"]]
通過指定序號範圍來提取行:
mydata[1:10] #默認情況下序列範圍是針對行切片(字元串默認則是針對列索引)mydata[200:] #切出201個之後的所有記錄(Python的數據類型默認從0開始編號)mydata[:100] #切出前一百個的所有記錄(默認從0開始,不包含尾部)mydata[:] #默認提取所有的數據記錄mydata[::2] #默認隔幾個單位取一次值
數據框可以同時疊加行列索引與切片:
mydata[1:10][["model","manufacturer"]]mydata[["model","manufacturer"]][1:10]
至於行切片與列索引的先後順序其實是無關緊要的。
除了基於數據框本身的這種簡單篩選之外,Python的數據框還提供很靈活的索引方式:
#標籤索引:(針對數據框的索引欄位)
mydata.loc[3] #按索引提取單行的數值mydata.loc[0:5] #按索引提取區域行數值mydata.loc[1:10,["model","manufacturer"]] #行列同時索引
如果標籤列是字元串或者日期,則使用同樣的規則,文本需要 添加單引號 或者雙引號。
#位置索引:(只針對行列位置對應的序號)
mydata.iloc[[0,2]] 等價於mydata.iloc[[0,2],:]mydata.iloc[1:] 等價於mydata.iloc[1:,:]mydata.iloc[1,[0,1]]mydata.iloc[:3,:2] mydata.iloc[[0,2,5],[4,5]]
#iloc索引的位置,平時使用是意義不大,只是需要理解其數字和字元串的指定規則,如果只需要提取行的話,列位置可以忽略或者使用「:」佔位,如果僅僅是提取列規則,保留所有行的話,則行位置必須提供佔位,否則會被當做行索引。
位置與標籤混合索引(ix函數):
#使用ix按索引標籤和位置混合提取數據df_inner.ix[:,:]
指定規則就是可以同時在行列參數指定位置靈活的提供位置參數和標籤參數(因本例使用的默認的數字索引欄位,沒有設置索引標籤)。
條件索引:
mydata[(mydata["model"]=="audi") | (mydata["manufacturer"]=="mercury")][["model","manufacturer","year","class"]]mydata[(mydata["model"]=="a4") & (mydata["manufacturer"]=="audi")][["model","manufacturer","year","class"]]
mydata.loc[(mydata["model"]=="audi") | (mydata["manufacturer"]=="mercury"),["model","manufacturer","year","class"]]mydata.loc[(mydata["model"]=="a4") & (mydata["manufacturer"]=="audi"),["model","manufacturer","year","class"]]
當然這種基於數據框本身的條件索引用法缺點如同在R語言中一樣,不夠優雅,需要額外寫很多欄位名稱,所以也有藉助外部函數來實現的方法:
mydata.query("model=="audi" | manufacturer=="mercury"")mydata.query(" model=="a4" & manufacturer=="audi" ")
好吧,講了這麼多,終於可以開始總結一下R語言與Python的切片索引規則重要的區別了:
- R語言中生成數據框使用的圓括弧,Python中則根據不同數據類型分別定義(列表用方括弧、元組用圓括弧、字典和幾何用花括弧)
- R語言和Python索引都用方括弧,且都是使用逗號進行行規則和列規則的位置間隔
- R語言與Python在索引多行多列時傳入數據類型不同,R語言傳入向量,Python傳入列表。
- 在索引多行時,R與Python都可以使用連續行列,均需提供佔位符號,(R語言留白即可標識全選,Python則佔位則必須提供「:」符號),在索引多列時,均無需提供佔位符號。(當然提供了也不多餘)。
- R語言與Python都接受邏輯表達式:|表示或、&表示且。
- R語言默認索引從1開始,Python從0開始(不包含尾部)。
- R語言與Python均可以基於數據框自身進行索引切片,同時又都可以通過外部索引函數進行條件索引。
聯繫方式:
微信:ljty1991
博客主頁:raindu's home
個人公眾號:數據小魔方(datamofang)
團隊公眾號:EasyCharts
qq交流群:[魔方學院]298236508
推薦閱讀:
※Python數據分析及可視化實例之CentOS7.2+Python3x+Flask部署標準化配置流程
※Flask 實現小說網站 (二)
※Python實現3D建模工具
※Flask模板引擎:Jinja2語法介紹
※OpenCV:圖片操作基本知識(二)