有時數據讀入后並不是對整體數據進行分析,而是數據中的部分子集,例如,對於地鐵乘客量可能只關心某些時間段的流量,對於商品的交易可能只需要分析某些顏色的價格變動,對於醫療診斷數據可能只對某個年齡段的人群感興趣等。所以,該如何根據特定的條件實現數據子集的獲取將是本節的主要內容。
通常,在pandas模塊中實現數據框子集的獲取可以使用iloc,loc和ix三種‘方法’,這三種方法既可以對數據進行篩選,也可以實現變量的挑選,它們的語法可以表示
成【row_select,cols_select】.
iloc只能通過行號和列號進行數據篩選,我們可以將iloc中的‘i’理解為“integer”,即只能向【rows_select,cols_select】指定整數列表。該索引方式與數組的索引方式類似,都是從0開始,可以間隔取號,對於切片仍然無法取到上限。
loc要比iloc靈活一些,讀者可以將loc中的“1”理解為“label”,即可以向【rows_select,col_select】指定具體的行標簽和列標簽。注意,這里是標簽不再是索引。而且,還可以將rows_select指定為具體的篩選條件,在iloc中是無法做到的。
ix是iloc和loc的混合,讀者可以將ix理解為“mix”,該方法吸收了iloc和loc的優點,市數據庫子集的獲取更加靈活。(此方法忽略,最新的模塊好像已經去掉了,編譯的時候警告,待再驗證)
如下用具體的代碼來說明iloc和loc二者之間的差異:
import pandas as pd
df1 = pd.DataFrame({'name':['張三','李四','王二','丁一','李五'],
'gender':['男','女','女','女','男'],
'age':[23,26,22,25,27]},columns = ['name','gender','age'])
df1
#去除數據集的中間三行(所有女性),並且返回姓名和年齡兩列
df1.iloc[1:4,[0,2]]
df1.loc[1:3,['name','age']]
# df1.ix[1:3,[0,2]]
out:
再繼續研究,將員工的姓名用做行標簽
#將員工的姓名用作行標簽
df2 = df1.set_index('name')
df2
#同樣取出數據集的中間三行
df2.iloc[1:4,:]
df2.loc[['李四','王二','丁一'],:]
out:
很顯然,在實際的學習和工作中,觀測行的篩選很少是通過寫入具體的行索引或行標簽,而是對某些列做條件篩選,進而獲得目標數據.例如,在上面的df1數據集中,如何返回所有男性的姓名和年齡,代碼如下:
df1.loc[df1.gender == '男',['name','age']]
out: