Pandas中loc,iloc與直接切片的區別


最近使用pandas,一直搞不清楚其中幾種切片方法的區別,今天專門看了一下。

0. 把Series的行index或Dataframe的列名直接當做屬性來索引。

如:

s.index_name

df.column_name

但是這種方法索引的名字可能會與自帶的方法沖突,比如min,max等等,所以可能會失效。另外,在新版本中,這種索引方法不能作為左值。

1. df[]直接索引

  • 直接索引索引的是列,方口號里面的內容一般是列索引名。也可以接受一個列名組成的list來接受多個列名。
 
        
 df['A']
df[['A', 'B']]

如果要交換兩列,直接用這樣的方法是不對的:

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

這是因為pandas默認在賦值的時候回匹配列名,這里面的AB和BA實際上沒有區別。如果想要交換兩列的話,應該使用AB兩列的值作為右值,這樣就不帶列索引名了。

df.loc[:,['B', 'A']] = df[['A', 'B']].values
  • 索引slice對象,索引的是行,因為這樣做更加符合常理
df=pd.DataFrame(np.arange(16).reshape((4,4)),index=list(range(4)),columns=['a','b','c','d'])

df
Out[4]: 
    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15


 

df[0:1]
Out[6]: 
   a  b  c  d
0  0  1  2  3

這里如果是Series,就可以使用單獨的數字來索引;如果是Dataframe,就不可以,需要使用Python的slice對象形式的來索引。

2. loc,基於label的索引

由於pandas處理的是具有標簽的表格對象,所以設計一套基於標簽的索引方法是必要的,這就是loc

 loc索引要注意的是:

  • loc是基於標簽的,如果給出的索引中包含沒有的標簽,會報錯
  • loc索引的開閉區間機制和Python傳統的不同,而是與MATLAB類似的雙側閉區間,即只要出現,就會包含該標簽
  • 數字也可以放入loc中當做索引,但是這時數字指的是標簽而不是 位置
df.loc[0:3,'a':'c']
Out[9]: 
    a   b   c
0   0   1   2
1   4   5   6
2   8   9  10
3  12  13  14

注意上面的0:3實際上並不是數字,而是行的label。

loc也可以接受布爾索引來取出其中的一些行

df.loc[df.loc[:,'a']>1]

3. iloc,完全基於位置的索引

iloc的用法完全和numpy中的數字索引一樣,開閉區間的邏輯也和Python是相同的。

要注意的是,如果iloc方括號中直接給定一個數字或者一個slice的話,默認索引的是行。其中數字的情況會返回一個Series

df.loc[:,df.loc[1]>1]
Out[21]: 
    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15

df.loc[:,df.loc[1]>4]
Out[22]: 
    b   c   d
0   1   2   3
1   5   6   7
2   9  10  11
3  13  14  15

df.iloc[1]
Out[23]: 
a    4
b    5
c    6
d    7
Name: 1, dtype: int32

type(df.iloc[1])
Out[24]: pandas.core.series.Series

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM