约定
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 |
谢谢大家的浏览,
希望我的努力能帮助到您,
共勉!