pandas,

完全攻略pandas文檔教學 Indexing and Selecting Data

Champion Champion Follow Mar 19, 2021 · 2 mins read
完全攻略pandas文檔教學 Indexing and Selecting Data
Share this

在使用pandas的時候最常使用到的就是索引(index),常常需要在資料表裡找出需要的資料,這時候就需要索引來幫助我們找出我們所需要的資料,在看完文檔後,整理了一下索引的使用方法

可使用的資料類型:Series,DataFrame,Panel

基本的索引:

我們使用[  ]來進行索引,就像下面這樣,左圖為我們建立的資料表,右圖為選取A欄位的結果

import pandas as pd
import numpy as np
dates=pd.date_range('1/1/2000',periods=8)
df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
df['A']
view raw pandas_code1.py hosted with ❤ by GitHub

或者可以一次傳入多個欄位

df[['A','B']]
view raw pandas_code2.py hosted with ❤ by GitHub

還有另外一種方法可以對資料進行索引,利用屬性 . 來進行索引,比如說像下面這樣:

df.A
view raw pandas_code3.py hosted with ❤ by GitHub

但是這種方法限制比較多所以還是用 [  ] 進行索引會比較好,限制如下:

1.索引名稱必須是valid identifier

2.索引名稱不能和python中存在的函數名稱一樣,例:df.min

3.索引名稱不能是index,major_axis,minor_axis,items,labels

上面用 [  ] 和 . 進行索引的方式是比較直覺的方法,但是常常我們並不事先知道資料的類型,運算上會有一些最佳化的限制,所以pandas提供了下面兩種方法:

1.使用.loc[]

這個方法會使用標籤(label)去尋找資料,總共有五種類型的標籤可輸入

(1)單一標籤,例如:’a’,’b’…..

(2)一個清單(list)或者陣列(array),例如:[“a”,”b”,”c”]

(3)切片標籤(slice object with labels),例如:”a”:”f”(兩側皆有包含)

(4)布林值陣列(boolean array)

(5)可調用函數(callable function)

何時會發生Error:當輸入的標籤找不到資料的時候,會出現KeyError

以下介紹幾個例子來讓大家看看

使用單一標籤

df.loc[:,'A']
view raw pandas_code4.py hosted with ❤ by GitHub

使用一個陣列去索引

df.loc[:,['A','C']]
view raw pandas_code5.py hosted with ❤ by GitHub

使用切片標籤

df.loc[:,'A':'C']
view raw pandas_code6.py hosted with ❤ by GitHub

使用布林值陣列

df.loc[:,df.loc['2000-01-01']>0]
view raw pandas_code6.py hosted with ❤ by GitHub

使用可調用函數

df.loc[lambda df:df.A>0,:]
view raw pandas_code7.py hosted with ❤ by GitHub

當使用loc的切片索引的時候會將切片範圍中的切片包含進來,若索引排序過後,即使切片範圍的兩邊都沒有在資料裡,還是會把範圍內的資料選取出來,反之若沒排序,就會發生KeyError,舉個例子給大家看看

s=pd.Series(list('abcde'),index=[0,3,2,5,4])
view raw pandas_code7.py hosted with ❤ by GitHub
s.loc[3:5]#2被選出來了
view raw pandas_code8.py hosted with ❤ by GitHub

將Series排序後在選取

s.sort_index().loc[1:6]#1和6都不在index裡,但是有排序所以把包含裡的都選出來了
view raw pandas_code8.py hosted with ❤ by GitHub

2.使用.iloc[]

這個方法會使用整數值去尋找資料,也和.loc一樣有上面這五種類型可以輸入

何時會發生Error:當輸入的整數索引超過資料的索引的時候,會出現IndexError(除了切片索引之外),但是使用.loc時若超過並不會發生Error會把輸入範圍內包含的資料找出來

以下幾個例子給大家看看:

df1=pd.DataFrame(np.random.randn(6,4), index=list(range(0,12,2)), columns=list(range(0,8,2)))
df1
view raw pandas_code9.py hosted with ❤ by GitHub

單一整數索引

df1.iloc[0]

使用一個陣列去索引

df1.iloc[[1,3,5],[1,3]]

切片索引

df1.iloc[1:5,2:4]

布林值陣列

df1.iloc[:,np.array(df1.iloc[0]>0)]#這裡必須把布林值的Series轉為陣列不然會發生NotImplementedError

注意:在使用loc和iloc時要注意一件事,pandas會先進行行對齊(column alignment)才會將值進行轉換,什麼意思呢?看下面的例子

本來選取A和B行的值是這樣

df[['A','B']]

如果你想要將這兩行的值互換,按照下面這樣做這樣,pandas會先A行和A行對齊,B行和B行對齊,因此並不會改變A行和B行的值

df.loc[:,['B','A']]=df[['A','B']]
df[['A','B']]

如果想要將A行和B行的值互換那就必須指定互換的是A行和B行的值,不然pandas會先進行行對齊,值就不會互換

df.loc[:,['B','A']]=df[['A','B']].values
df[['A','B']]

那以上就是關於Pandas索引方法的介紹,如果有什麼問題大家可以在下方留言,我會盡力回答大家!!!如果喜歡我的文章,可以幫我拍拍手哦~~~

Join Newsletter
Get the latest news right in your inbox. We never spam!
Champion
Written by Champion Follow
Hi, I am Champion, the author of CHAMPION.AI, I will share some AI and investment articles. I hope you like it.