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 |
謝謝大家的瀏覽,
希望我的努力能幫助到您,
共勉!