约定第一行代码

import numpy as np
import pandas as pd

下标存取

Series和DataFrame提供了丰富的下标存取方法,除了直接用[ ],还有.loc[ ]、.iloc[ ]、.at[ ]、.iat[ ]等存取方式

我们先来创建一个DataFrame对象

np.random.seed(42)
df1=pd.DataFrame(np.random.randint(1,10,(4,3)),index=['r1','r2','r3','r4'],columns=['c1','c2','c3'])
df1
c1c2c3
r1748
r2573
r3785
r4488

一、[ ] 操作符

支持一下六种下标对象

单个列标签

#返回Series对象
df1['c1']

#代码结果
r1    7
r2    5
r3    7
r4    4
Name: c1, dtype: int32

多个列标签

#返回DataFrame对象
df1[['c1','c3']]

代码结果

c1c3
r178
r253
r375
r448

行索引的整数切片

#返回DataFrame对象
df1[1:3]

代码结果

c1c2c3
r2573
r3785

行索引的标签切片

#注意包括终止标签
df1['r1':'r2']

代码结果

c1c2c3
r1748
r2573

布尔数组

df1.c1>5 是一个布尔序列

df1[df1.c1>5]

代码结果

c1c2c3
r1748
r3785

布尔DataFrame

df1>4 是一个布尔DataFrame对象

df1[df1>4]
c1c2c3
r17.0NaN8.0
r25.07.0NaN
r37.08.05.0
r4NaN8.08.0

值得注意的是,类似df1[1]、df1[‘r1’]的位置存取、单个行标签存取是错误的

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

.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']]
c1c2c3
r1748
r2573

行、列筛选

df1.loc[['r1','r2'],['c1','c3']]
c1c3
r178
r253

.iloc[ ]与.loc[ ]相似,但不同的是,.iloc[ ]使用整数下标

df1.iloc[2]

#代码结果
c1    7
c2    8
c3    5
Name: r3, dtype: int32
df1.iloc[[2,1]]
c1c2c3
r3785
r2573

获取单个值

.at[ ]和.iat[ ] 能使用标签和整数下标获取单个值。此外,推荐.get_value(),相比前面的更快

df1.at['r1','c3']

#代码结果
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)]

代码结果

c1c2c3
r2573

这时我们就可以使用query()能简化

df1.query("c1>4 and c3<5")
c1c2c3
r2573

世界因代码而改变 Peace Out
世界因代码而改变 Peace Out
最后修改:2020 年 10 月 07 日 03 : 21 PM
如果觉得我的文章对你有用,请随意赞赏