使用pandas索引和选择数据时,总是需要百度,因此决定对pandas.DataFrame中的索引和选择方法做个总结。所用的pandas版本号为0.20.1
pandas中有三种索引方法:.loc.iloc[],注意:.ix的用法在0.20.0中已经不建议使用了!

下文中全部使用一个DataFrame来举例:
pandas索引和选择数据

.loc用法

.loc主要是基于标签(label)的,包括行标签(index)和列标签(columns),即行名称和列名称,可以使用df.loc[index_name,col_name],选择指定位置的数据,其它的用法有:
1. 使用单个标签。如果.loc[]中只有单个标签,那么选择的是某一行。 df.loc[3]选择的是index名为‘3’的一行,注意这里的’3’是index的名称,而不是序号
pandas索引和选择数据
2. 使用标签的list:同样是只选择行
pandas索引和选择数据
3. 标签的切片对象:与通常的python切片不同,在最终选择的数据中包含切片的startstop
pandas索引和选择数据
4. 布尔型的数组:通常用于筛选符合某些条件的行
pandas索引和选择数据
pandas索引和选择数据
5. 可调用的函数
pandas索引和选择数据
lambda表达式语法:
lambda 传入参数 : 返回的计算表达式

iloc用法

iloc是基于位置的索引,利用元素在各个轴上的索引序号进行选择,序号超出范围会产生IndexError,切片时允许序号超过范围,用法包括:
1. 使用整数:与.loc相同,如果只使用一个维度,则对行选择,下标从0开始
pandas索引和选择数据
2. 使用列表或数组,同样是对行选择
pandas索引和选择数据
pandas索引和选择数据
3. 元素为整数的切片对象:与.loc不同的是,这里下标为stop的数据不被选择
pandas索引和选择数据
也可以对列进行切片:
pandas索引和选择数据
4. 使用布尔数组进行筛选:注意这里可以使用list或者array,使用Series的话会出错,NotImplementedError或者ValueError,前者是Series的index与待切片DataFrame的index不同时,后者是index相同时报的错,可以自己实现体会一下。与.loc使用布尔数组,可以使用listarray,也可以使用Series,使用Series时index需要一致,否则会报IndexingError
pandas索引和选择数据
5.使用可调用函数
pandas索引和选择数据

切片操作[]

  • []操作只能输入一个维度,不能用逗号隔开输入两个维度:
    pandas索引和选择数据

    1. 使用列名.lociloc只输入一维时选取的是行,而[]选取的是列,并且必须使用列名
      pandas索引和选择数据
    2. 使用布尔数组:bool数组的index需要和dataframe的index一致,此时选取的是行
      pandas索引和选择数据
      因此可以用来筛选符合条件的行:
      pandas索引和选择数据
  • 避免chained assignment
    在对数据赋值使可以有以下两种操作:
    df.loc[df.C>0.5,'C']=0.6
    df[df.C>0.5][['C']]=0.6
    上面的操作可以在df上直接修改数据,而下面的操作被称为chained assignment,会产生SettingWithCopyWarning,官网上的解释:indexing-view-versus-copy。直观来说就使用chained assignment无法预测是否能对数据df进行修改,使用loc一定是直接在df上修改数据,因此建议使用loc

相关文章: