Pandas詳解五之下標存取

約定
import pandas as pd
import numpy as  np

下標存取

Series和DataFrame提供了豐富的下標存取方法,除了直接用[ ],還有.loc[ ].iloc[ ].at[ ].iat[ ].ix[ ]等存取方式。

np.random.seed(42)
df1=pd.DataFrame(np.random.randint(1,10,(4,3)),index=['r1','r2','r3','r4'],columns=['c1','c2','c3'])
df1
代碼結果:
c1 c2 c3
r1 7 4 8
r2 5 7 3
r3 7 8 5
r4 4 8 8

一、[ ] 操作符

支持以下6種下標對象:

  • 單個列標籤

返回Series對象

df1['c1']

代碼結果:

r1    7
r2    5
r3    7
r4    4
Name: c1, dtype: int32
  • 多個列標籤

返回DataFrame對象

df1[['c1','c3']]
代碼結果:
c1 c3
r1 7 8
r2 5 3
r3 7 5
r4 4 8
  • 行索引的整數切片
df1[1:3]
代碼結果:
c1 c2 c3
r2 5 7 3
r3 7 8 5
  • 行索引的標籤切片

注意包括終止標籤

df1['r1':'r2']
代碼結果:
c1 c2 c3
r1 7 4 8
r2 5 7 3
  • 布爾數組

df1.c1>5 是一個布爾序列

df1[df1.c1>5]
代碼結果:
c1 c2 c3
r1 7 4 8
r3 7 8 5
  • 布爾DataFrame

df1>4 是一個布爾DataFrame對象

df1[df1>4]
代碼結果:
c1 c2 c3
r1 7.0 NaN 8.0
r2 5.0 7.0 NaN
r3 7.0 8.0 5.0
r4 NaN 8.0 8.0
  • 注意,類似df1[1]、df1[‘r1’]的位置存取、單個行標籤存取是錯誤的。

二、.loc[ ] 和 .iloc[ ] 存取器

.loc[y]/.iloc[y]:y可以是單個值,也可是多個值(列表),y代表行索引

.loc[y,x]/.iloc[y,x]:y代表行索引,x代表列索引

  • 上面說到了df1[‘r1’]單個行標籤存取是錯誤的,則用.loc[]能可以。
df1.loc['r1']

代碼結果:

c1    7
c2    4
c3    8
Name: r1, dtype: int32
  • 獲取多行
df1.loc[['r1','r2']]
代碼結果:
c1 c2 c3
r1 7 4 8
r2 5 7 3
  • 行、列篩選
df1.loc[['r1','r2'],['c1','c3']]
代碼結果:
c1 c3
r1 7 8
r2 5 3
  • .iloc[ ]與.loc[ ]相似,但不同的是,.iloc[ ]使用整數下標:
df1.iloc[2]

代碼結果:

c1    7
c2    8
c3    5
Name: r3, dtype: int32
df1.iloc[[2,1]]
代碼結果:
c1 c2 c3
r3 7 8 5
r2 5 7 3

三、.ix[ ]存取器

.ix[ ]特點爲綜合了前面的,可以混用標籤、位置下標存取。

同樣的,下標中,第一個爲行索引,第二個爲列索引。

df1.ix['r2',1:3]

代碼結果:

c2    7
c3    3
Name: r2, dtype: int32
df1.ix[1:3,['c1','c3']]
代碼結果:
c1 c3
r2 5 3
r3 7 5

四、獲取單個值

  • .at[ ]和.iat[ ] 能使用標籤和整數下標獲取單個值。此外,推薦.get_value(),相比前面的更快。
df1.at['r1','c3']

代碼結果:

8
df1.iat[0,2]

代碼結果:

8
df1.get_value('r1','c3')

代碼結果:

8
  • 獲取成對標籤的單個值
df1.lookup(['r1','r3','r1'],['c3','c2','c2'])

代碼結果:

array([8, 8, 4])

五、query()方法

  • 當需要篩選時,我們可能會:
df1[(df1.c1>4)&(df1.c3<5)]
代碼結果:
c1 c2 c3
r2 5 7 3
  • 使用query()能簡化:
df1.query("c1>4 and c3<5")
代碼結果:
c1 c2 c3
r2 5 7 3

謝謝大家的瀏覽,
希望我的努力能幫助到您,
共勉!

發佈了48 篇原創文章 · 獲贊 181 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章