【數據分析】pandas數據選取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]

1 引言

  Pandas是作爲Python數據分析著名的工具包,提供了多種數據選取的方法,方便實用。本文主要介紹Pandas的幾種數據選取的方法。

  Pandas中,數據主要保存爲Dataframe和Series是數據結構,這兩種數據結構數據選取的方式基本一致,本文主要以Dataframe爲例進行介紹。

  在Dataframe中選取數據大抵包括3中情況:

  1)行(列)選取(單維度選取):df[]。這種情況一次只能選取行或者列,即一次選取中,只能爲行或者列設置篩選條件(只能爲一個維度設置篩選條件)。

  2)區域選取(多維選取):df.loc[],df.iloc[],df.ix[]。這種方式可以同時爲多個維度設置篩選條件。

  3)單元格選取(點選取):df.at[],df.iat[]。準確定位一個單元格。

  接下來,我們以下面的數據爲例,分別通過實例介紹這三種情況。

>>> 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

2 行(列)選取:df[]

  行(列)選取是在單一維度上進行數據的選取,即以行爲單位進行選取或者以列爲單位進行選取。Dataframe對象的行有索引(index),默認情況下是[0,1,2,……]的整數序列,也可以自定義添加另外的索引,例如上面的labels,(爲區分默認索引和自定義的索引,在本文中將默認索引稱爲整數索引,自定義索引稱爲標籤索引)。Dataframe對象的每一列都有列名,可以通過列名實現對列的選取。

  1)選取行

選取行的方式包括三種:整數索引切片、標籤索引切片和布爾數組。

  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
  • 選取所有age大於30的行
>>> 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

  通過布爾數組的方式,又可以衍生出下面的選取方式:

  • 選取出所有age大於30的行
>>> 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
  • 選取出所有age大於30,且isMarried爲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

 

  • 選取出所有age爲20或32的行
>>> 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)標籤索引:選取單個列

  • 選取name列所有數據
>>> 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)標籤列表:選取多個列

  • 選取name和age兩列數據
>>> 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

3 區域選取

  區域選取可以從多個維度(行和列)對數據進行篩選,可以通過df.loc[],df.iloc[],df.ix[]三種方法實現。採用df.loc[],df.iloc[],df.ix[]這三種方法進行數據選取時,方括號內必須有兩個參數,第一個參數是對行的篩選條件,第二個參數是對列的篩選條件,兩個參數用逗號隔開。df.loc[],df.iloc[],df.ix[]的區別如下:

  df.loc[]只能使用標籤索引,不能使用整數索引,通過便籤索引切邊進行篩選時,前閉後閉

  df.iloc[]只能使用整數索引,不能使用標籤索引,通過整數索引切邊進行篩選時,前閉後開

  df.ix[]既可以使用標籤索引,也可以使用整數索引。

  下面分別通過實例演示這三種方法。

3.1 df.loc[]

  1)對行進行選取

  • 選取索引爲‘a’的行:
>>> df.loc['a', :]

name         Joe

age           25

gender         1

isMarried    yes

Name: a, dtype: object
  • 選取索引爲‘a’,‘b’,‘c’的行
>>> 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
  • 選取從‘a’到‘d’的所有行(包括‘d’行)[標籤索引,前閉8後閉]
>>> 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
  • 用布爾數組選取前3行
>>> 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
  • 選取所有age大於30的行
>>> 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, :]  # loc: 標籤索引,左閉右閉

    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, :]  # iloc: 整數索引,左閉右開

    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
  • 用callable對象選取age大於30的所有行
>>> 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)對列選取

  • 輸出所有人的姓名(選取name列)
>>> 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
  • 輸出所有人的姓名和年齡(選取name和age列)
>>> 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
  • 輸出所有人的姓名、年齡、婚否(選取name、age、isMarried列)
>>> 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
  • 用布爾數組的方式選取前3列
>>> 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)同時對行和列進行篩選

  • 輸出年齡大於30的人的姓名和年齡
>>> 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
  • 輸出行名爲‘Mike’或‘Marry’的姓名和年齡
>>> df.loc[(df['name']=='Mike') |(df['name']=='Marry'),['name','age']]

    name   age

b   Mike  32.0

f  Marry  20.0

3.2 df.iloc[]

  1)行選取

  • 選取第2行
>>> df.iloc[1, :]

name         Mike

age            32

gender          0

isMarried     yes

Name: b, dtype: object
  • 選取前3行
>>> 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
  • 選取第2行、第4行、第6行
>>> 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
  • 通過布爾數組選取前3行
>>> 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)列選取

  • 選取第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

 

  • 選取前3列
>>> 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列

 

  • 選取第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

 

  • 通過布爾數組選取前3列
>>> 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)同時選取行和列

  • 選取第2行的第1列、第3列、第4列
>>> df.iloc[1, [0,2,3]]

name         Mike

gender          0

isMarried     yes

Name: b, dtype: object

 

  • 選取前3行的前3列
>>> df.iloc[:3, :3]

   name   age  gender

a   Joe  25.0       1

b  Mike  32.0       0

c  Jack  18.0       1

3.3 df.ix[]

  df.ix[]既可以通過整數索引進行數據選取,也可以通過標籤索引進行數據選取,換句話說,df.ix[]是df.loc[]和df.iloc[]的功能集合,且在同義詞選取中,可以同時使用整數索引和標籤索引。

  • 選取第3行的name數據
>>> df.ix[2,'name']

'Jack'
  • 選取a行、c行的第1列,第2列和第4列數據
>>> 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

4 單元格選取

  單元格選取包括df.at[]和df.iat[]兩種方法。df.at[]和df.iat[]使用時必須輸入兩個參數,即行索引和列索引,其中:

       df.at[]只能使用標籤索引,

       df.iat[]只能使用整數索引。

       df.at[]和df.iat[]選取的都是單個單元格(單行單列),所以返回值都爲基本數據類型。

4.1 df.at[]

  • 選取b行的name列
>>> df.at['b','name']

'Mike'

4.2 df.iat[]

  • 選取第2行第1列
>>> df.iat[1,0]

'Mike'

5 拓展與總結

  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)選取數據時,返回值存在以下情況:

  • 如果返回值包括單行多列或多行單列時,返回值爲Series對象;
  • 如果返回值包括多行多列時,返回值爲DataFrame對象;
  • 如果返回值僅爲一個單元格(單行單列)時,返回值爲基本數據類型,例如str,int等。

  5)df[]的方式只能選取行和列數據,不能精確到單元格,所以df[]的返回值一定DataFrame或Series對象。

  6)當使用DataFrame的默認索引(整數索引)時,整數索引即爲標籤索引。例如,使用上面的data實例化一個DataFrame對象:

>>> df2 = pd.DataFrame(data)

>>> df2.loc[1,'name']

'Mike'

>>> df2.iloc[1,0]

'Mike'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章