Pandas是做爲Python數據分析著名的工具包,提供了多種數據選取的方法,方便實用。本文主要介紹Pandas的幾種數據選取的方法。數組
Pandas中,數據主要保存爲Dataframe和Series是數據結構,這兩種數據結構數據選取的方式基本一致,本文主要以Dataframe爲例進行介紹。數據結構
在Dataframe中選取數據大抵包括3中狀況:工具
1)行(列)選取(單維度選取):df[]。這種狀況一次只能選取行或者列,即一次選取中,只能爲行或者列設置篩選條件(只能爲一個維度設置篩選條件)。spa
2)區域選取(多維選取):df.loc[],df.iloc[],df.ix[]。這種方式能夠同時爲多個維度設置篩選條件。code
3)單元格選取(點選取):df.at[],df.iat[]。準肯定位一個單元格。對象
接下來,咱們如下面的數據爲例,分別經過實例介紹這三種狀況。blog
>>> import pandas as pd >>> import numpy as np >>> data = {'name': ['Joe', 'Mike', 'Jack', 'Rose', 'David', 'Marry', 'Wansi', 'Sidy', 'Jason', 'Even'], 'age': [25, 32, 18, np.nan, 15, 20, 41, np.nan, 37, 32], 'gender': [1, 0, 1, 1, 0, 1, 0, 0, 1, 0], 'isMarried': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']} >>> labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] >>> df = pd.DataFrame(data, index=labels) >>> df name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes c Jack 18.0 1 no d Rose NaN 1 yes e David 15.0 0 no f Marry 20.0 1 no g Wansi 41.0 0 no h Sidy NaN 0 yes i Jason 37.0 1 no j Even 32.0 0 no
行(列)選取是在單一維度上進行數據的選取,即以行爲單位進行選取或者以列爲單位進行選取。Dataframe對象的行有索引(index),默認狀況下是[0,1,2,……]的整數序列,也能夠自定義添加另外的索引,例如上面的labels,(爲區分默認索引和自定義的索引,在本文中將默認索引稱爲整數索引,自定義索引稱爲標籤索引)。Dataframe對象的每一列都有列名,能夠經過列名實現對列的選取。索引
1)選取行數據分析
選取行的方式包括三種:整數索引切片、標籤索引切片和布爾數組。pandas
a)整數索引切片:前閉後開
>>> df[0:1] name age gender isMarried a Joe 25.0 1 yes
>>> df[0:2] name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes
b)標籤索引切片:前閉後閉
>>> df[:'a'] name age gender isMarried a Joe 25.0 1 yes
>>> df['a':'b'] name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes
注意:整數索引切片是前閉後開,標籤索引切片是前閉後閉,這點尤爲要注意。
c)布爾數組
>>> df[[True,True,True,False,False,False,False,False,False,False]] name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes c Jack 18.0 1 no
>>> df[[each>30 for each in df['age']]] name age gender isMarried b Mike 32.0 0 yes g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no
經過布爾數組的方式,又能夠衍生出下面的選取方式:
>>> df[df['age']>30] name age gender isMarried b Mike 32.0 0 yes g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no
>>> df[(df['age']>30) & (df['isMarried']=='no')] name age gender isMarried g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no
>>> df[(df['age']==20) | (df['age']==32)] name age gender isMarried b Mike 32.0 0 yes f Marry 20.0 1 no j Even 32.0 0 no
注意:像上面這種經過多個布爾條件判斷的狀況,多個條件最好(必定)用括號括起來,不然很是容易出錯。
2)列選取
列選取方式也有三種:標籤索引、標籤列表、Callable對象
a)標籤索引:選取單個列
>>> df['name'] a Joe b Mike c Jack d Rose e David f Marry g Wansi h Sidy i Jason j Even Name: name, dtype: object
b)標籤列表:選取多個列
>>> df[['name','age']] name age a Joe 25.0 b Mike 32.0 c Jack 18.0 d Rose NaN e David 15.0 f Marry 20.0 g Wansi 41.0 h Sidy NaN i Jason 37.0 j Even 32.0
c)callable對象
>>> df[lambda df: df.columns[0]] a Joe b Mike c Jack d Rose e David f Marry g Wansi h Sidy i Jason j Even Name: name, dtype: object
區域選取能夠從多個維度(行和列)對數據進行篩選,能夠經過df.loc[],df.iloc[],df.ix[]三種方法實現。採用df.loc[],df.iloc[],df.ix[]這三種方法進行數據選取時,方括號內必須有兩個參數,第一個參數是對行的篩選條件,第二個參數是對列的篩選條件,兩個參數用逗號隔開。df.loc[],df.iloc[],df.ix[]的區別以下:
df.loc[]只能使用標籤索引,不能使用整數索引,經過便籤索引切邊進行篩選時,前閉後閉。
df.iloc[]只能使用整數索引,不能使用標籤索引,經過整數索引切邊進行篩選時,前閉後開。;
df.ix[]既可使用標籤索引,也可使用整數索引。
下面分別經過實例演示這三種方法。
1)對行進行選取
>>> df.loc['a', :] name Joe age 25 gender 1 isMarried yes Name: a, dtype: object
>>> df.loc[['a','b','c'], :] name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes c Jack 18.0 1 no
>>> df.loc['a':'d', :] name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes c Jack 18.0 1 no d Rose NaN 1 yes
>>> df.loc[[True,True,True,False,False,False], :] name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes c Jack 18.0 1 no
>>> df.loc[df['age']>30,:] name age gender isMarried b Mike 32.0 0 yes g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no
也可使用下面兩方法:
>>> df.loc[df.loc[:,'age']>30, :] name age gender isMarried b Mike 32.0 0 yes g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no >>> df.loc[df.iloc[:,1]>30, :] name age gender isMarried b Mike 32.0 0 yes g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no
>>> df.loc[lambda df:df['age'] > 30, :] name age gender isMarried b Mike 32.0 0 yes g Wansi 41.0 0 no i Jason 37.0 1 no j Even 32.0 0 no
2)對列選取
>>> df.loc[:, 'name'] a Joe b Mike c Jack d Rose e David f Marry g Wansi h Sidy i Jason j Even Name: name, dtype: object
>>> df.loc[:, 'name':'age'] name age a Joe 25.0 b Mike 32.0 c Jack 18.0 d Rose NaN e David 15.0 f Marry 20.0 g Wansi 41.0 h Sidy NaN i Jason 37.0 j Even 32.0
>>> df.loc[:, ['name','age','isMarried']] name age isMarried a Joe 25.0 yes b Mike 32.0 yes c Jack 18.0 no d Rose NaN yes e David 15.0 no f Marry 20.0 no g Wansi 41.0 no h Sidy NaN yes i Jason 37.0 no j Even 32.0 no
>>> df.loc[:, [True,True,True,False]] name age gender a Joe 25.0 1 b Mike 32.0 0 c Jack 18.0 1 d Rose NaN 1 e David 15.0 0 f Marry 20.0 1 g Wansi 41.0 0 h Sidy NaN 0 i Jason 37.0 1 j Even 32.0 0
3)同時對行和列進行篩選
>>> df.loc[df['age']>30,['name','age']] name age b Mike 32.0 g Wansi 41.0 i Jason 37.0 j Even 32.0
>>> df.loc[(df['name']=='Mike') |(df['name']=='Marry'),['name','age']] name age b Mike 32.0 f Marry 20.0
1)行選取
>>> df.iloc[1, :] name Mike age 32 gender 0 isMarried yes Name: b, dtype: object
>>> df.iloc[:3, :] name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes c Jack 18.0 1 no
>>> df.iloc[[1,3,5],:] name age gender isMarried b Mike 32.0 0 yes d Rose NaN 1 yes f Marry 20.0 1 no
>>> df.iloc[[True,True,True,False,False,False], :] name age gender isMarried a Joe 25.0 1 yes b Mike 32.0 0 yes c Jack 18.0 1 no
2)列選取
>>> df.iloc[:, 1] a 25.0 b 32.0 c 18.0 d NaN e 15.0 f 20.0 g 41.0 h NaN i 37.0 j 32.0 Name: age, dtype: float64
>>> df.iloc[:, 0:3] name age gender a Joe 25.0 1 b Mike 32.0 0 c Jack 18.0 1 d Rose NaN 1 e David 15.0 0 f Marry 20.0 1 g Wansi 41.0 0 h Sidy NaN 0 i Jason 37.0 1 j Even 32.0 0 l 選取第1列、第3列、第4列
>>> df.iloc[:, [0,2,3]] name gender isMarried a Joe 1 yes b Mike 0 yes c Jack 1 no d Rose 1 yes e David 0 no f Marry 1 no g Wansi 0 no h Sidy 0 yes i Jason 1 no j Even 0 no
>>> df.iloc[:,[True,True,True,False]] name age gender a Joe 25.0 1 b Mike 32.0 0 c Jack 18.0 1 d Rose NaN 1 e David 15.0 0 f Marry 20.0 1 g Wansi 41.0 0 h Sidy NaN 0 i Jason 37.0 1 j Even 32.0 0
3)同時選取行和列
>>> df.iloc[1, [0,2,3]] name Mike gender 0 isMarried yes Name: b, dtype: object
>>> df.iloc[:3, :3] name age gender a Joe 25.0 1 b Mike 32.0 0 c Jack 18.0 1
df.ix[]既能夠經過整數索引進行數據選取,也能夠經過標籤索引進行數據選取,換句話說,df.ix[]是df.loc[]和df.iloc[]的功能集合,且在同義詞選取中,能夠同時使用整數索引和標籤索引。
>>> df.ix[2,'name'] 'Jack'
>>> df.ix[['a','c'], [0,1,3]] name age isMarried a Joe 25.0 yes c Jack 18.0 no
>>> df.ix[df['isMarried']=='no',['name','age']] name age c Jack 18.0 e David 15.0 f Marry 20.0 g Wansi 41.0 i Jason 37.0 j Even 32.0
單元格選取包括df.at[]和df.iat[]兩種方法。df.at[]和df.iat[]使用時必須輸入兩個參數,即行索引和列索引,其中df.at[]只能使用標籤索引,df.iat[]只能使用整數索引。df.at[]和df.iat[]選取的都是單個單元格(單行單列),因此返回值都爲基本數據類型。
>>> df.at['b','name'] 'Mike'
>>> df.iat[1,0] 'Mike'
1)選取某一整行(多個整行)或某一整列(多個整列)數據時,能夠用df[]、df.loc[]、df.iloc[],此時df[]的方法書寫要簡單一些。
2)進行區域選取時,若是隻能用標籤索引,則使用df.loc[]或df.ix[],若是隻能用整數索引,則用df.iloc[]或df.ix[]。不過我看到有資料說,不建議使用df.ix[],由於df.loc[]和df.iloc[]更精確(有嗎?我沒理解精確在哪,望告知)。
3)若是選取單元格,則df.at[]、df.iat[]、df.loc[]、df.iloc[]均可以,不過要注意參數。
4)選取數據時,返回值存在如下狀況:
5)df[]的方式只能選取行和列數據,不能精確到單元格,因此df[]的返回值必定DataFrame或Series對象。
6)當使用DataFrame的默認索引(整數索引)時,整數索引即爲標籤索引。例如,使用上面的data實例化一個DataFrame對象:
>>> df2 = pd.DataFrame(data) >>> df2.loc[1,'name'] 'Mike' >>> df2.iloc[1,0] 'Mike'