Datawhale干货
作者:闫钟峰,Datawhale优秀学习者
寄语:本文对单级索引中的loc、iloc、[]三种方法进行了详细的阐述。同时,对布尔索引,快速标量索引方式、区间索引方式做了详细介绍。
读取csv数据的时候, 使用参数index_col指定表中的列作为索引
import numpy as np
import pandas as pd
df = pd.read_csv('data/table.csv',index_col='ID')
df.head()
效果等同于读取数据后, 使用set_index方法指定某一列为索引,但index_col的方式更简洁。
df1 = pd.read_csv('data/table.csv')
df2=df1.set_index(['ID'])
df2.head()
最常用的索引方法有三类:
loc表示标签索引
iloc表示位置索引
[]也具有很大的便利性。
loc方法
注意:所有在loc中使用的切片全部包含右端点!
① 单行索引
df.loc[1103]
虽然这里的1103是整数, 但loc索引方式用的是索引标签, 而不是默认整数索引(注意默认整数索引和标签索引这二者有时候是一样的)
② 多行索引
多行索引时,需传入一个list,而不是多个索引
df.loc[[1102,2304]]
多行索引时, 传入的必须是一个list, 而不是两个或多个索引, 否则会报错
#以下索引报错
# TypeError: cannot do label indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [2304] of <class 'int'>
df.loc[1102,2304]
list的切片方法可以沿用
df.loc[1304:].head()
和list的情形一样, 2402::-1表示从索引标签=2402的元素开始,以步长=1返回list的元素, 负号表示方向是从后向前。注意由于用的是loc, 所以这里的2402是标签索引, 这和list所用默认整数索引不一样。
df.loc[2402::-1].head()
③ 单列索引
使用loc方法获取列, 比直接使用列标签获取列更复杂
df.loc[:,'Height'].head()
等价的更简单的获取列的方法,loc和iloc的长处在于, 可以同时对列和行进行切片
df['Height'].head()
更简洁的使用列名标签索引的方式
df.Height.head()
④ 多列索引
df.loc[:,['Height','Math']].head()
# 等价于df[['Height','Math']].head()
注意传入的应该是list
df[['Height','Math']].head()
使用列名标签做切片---这是list里所没有的
df.loc[:,'Height':'Math'].head()
还可以使用iloc的方式进行切片, 这时候传入的应该是默认整数索引, 从0开始, 并且切片的结尾是不包含的
df.iloc[:,4:7].head()
切片方法对列名不成立,若使用报错如下:
# 以下语句报错
# TypeError: cannot do slice indexing on <class 'pandas.core.indexes.numeric.Int64Index'> with these indexers [Height] of <class 'str'>
df['Height':'Math'].head()
⑤ 联合索引
1102=起点,2401=终点,3=步长
df.loc[1102:2401:3,'Height':'Math']#.head()
⑥ 函数式索引
loc中使用的函数,传入参数就是前面的df;本质上这是一个布尔索引: lambda函数分别根据每行的Gender值列返回一个布尔值, 然后用这个布尔值序列来筛选df的行,布尔值为真则返回,否则筛选掉。
df.loc[lambda x:x['Gender']=='M'].head()
看起来和上述略有不同。但实际上, 使用loc等方法筛选行或者列的时候, 都是根据待筛选的行或者列对给定的筛选条件是否为真来决定是否返回该行或该列的。
def f(x):
return [1101,1103]
df.loc[f]
⑦ 布尔索引
df.loc[df['Address'].isin(['street_7','street_4'])].head()
# 类似的sql语句为 select * from df where Address in ('street_7','street_4')