Fork me on github

Pandas索引

一、索引器

1. 表的列索引

列索引是最常见的索引形式,一般通过 [ ] 来实现。通过 [列名] 可以从 DataFrame 中取出相应的列,返回值为 Series。
【例子】从表中取出姓名一列

df['Name'].head()

如果要取出多个列,则可以通过 [列名组成的列表] ,其返回值为一个 DataFrame ,例如从表中取出性别和姓名两列:

df[['Gender', 'Name']].head()

若要取出单列,且列名中不包含空格,则可以用 .列名 取出,这和 [列名] 是等价的。

df.Name.head()

2. 序列的行索引

  • 以字符串为索引的 Series
    如果取出单个索引的对应元素,则可以使用 [item] ,若 Series 只有单个值对应,则返回这个标量值,如果有多个值对应,则返回一个 Series :s['b']
    如果取出多个索引的对应元素,则可以使用 [items的列表] :s[['c', 'b']]
  • 以整数为索引的 Series
    在使用数据的读入函数时,如果不特别指定所对应的列作为索引,那么会生成从0开始的整数索引作为默认索引。当然,任意一组符合长度要求的整数都可以作为索引。
    和字符串一样,如果使用 [int] 或 [int_list] ,则可以取出对应索引 元素 的值
s = pd.Series(['a', 'b', 'c', 'd', 'e', 'f'],
              index=[1, 3, 1, 2, 5, 4])
s[1]
s[[2,3]]

3. loc索引器

loc 索引器的一般形式是 loc[*, ] ,其中第一个 * 代表行的选择,第二个 * 代表列的选择,如果省略第二个位置写作 loc[] ,这个 * 是指行的筛选。其中, * 的位置一共有五类合法对象,分别是:单个元素、元素列表、元素切片、布尔列表以及函数。

  • 为单个元素
    此时,直接取出相应的行或列,如果该元素在索引中重复则结果为 DataFrame,否则为 Series :
  • 为元素列表
    此时,取出列表中所有元素值对应的行或列:
  • 为切片
    之前的 Series 使用字符串索引时提到,如果是唯一值的起点和终点字符,那么就可以使用切片,并且包含两个端点,如果不唯一则报错:
    需要注意的是,如果 DataFrame 使用整数索引,其使用整数切片的时候和上面字符串索引的要求一致,都是 元素 切片,包含端点且起点、终点不允许有重复值。
  • 为布尔列表
    在实际的数据处理中,根据条件来筛选行是极其常见的,此处传入 loc 的布尔列表与 DataFrame 长度相同,且列表为 True 的位置所对应的行会被选中, False 则会被剔除。
  • 为函数
    这里的函数,必须以前面的四种合法形式之一为返回值,并且函数的输入值为 DataFrame 本身。

多级索引

多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有2个以及2个以上的索引。
实质上,单级索引对应Index对象,多级索引对应MultiIndex对象。

  • 多级索引Series对象的创建
se1=pd.Series(np.random.randn(4),index=[list("aabb"),[1,2,1,2]])
se1
a  1    0.945676
   2    1.240454
b  1    1.021960
   2    0.363063
dtype: float64
  • 子集的选取
se1['a']
1    0.945676
2    1.240454
dtype: float64
  • DataFrame对象的多级索引
    创建:
df1=pd.DataFrame(np.arange(12).reshape(4,3),index=[list("AABB"),[1,2,1,2]],columns=[list("XXY"),[10,11,10]])
df1

索引运算

  • .loc()
    .loc()主要基于标签(label)的,包括行标签(index)和列标签(colums),即行名称和列名称,可以使用def.loc[index_name, col_name]选择指定位置的数据,主要用法有:
    单个标量标签,如果.loc中只有单个标签,那么选择的是一行。如:df.loc['a']选择的是 index 为’a’的一样。
    标签列表,如:df.loc[['a', 'b', 'c']],同样只选择行。
    切片对象,与通常的 python 切片不同,在最终选择的数据数据中包含切片的 start 和 stop。如:df.loc['c' : 'h'] 即包含’c’行,也包含’h’行。
    布尔数组,用于筛选符合某些条件的行,如:df.loc[df.A>0.5] 筛选出所有’A’列大于0.5的行。

  • .iloc()
    .iloc() 是基于整数的索引,利用元素在各个轴上的索引序号进行选择,序号超过范围产生IndexError,切片时允许序号超过范围。
    各种访问方式如下 –
    整数,与.loc相同,如果只使用一个维度,则对行选择,小标从 0 开始。如:df.iloc[5],选择第 6 行。
    整数列表或者数组,如df.iloc[[5, 1, 7]],选择第 6 行, 第 2 行, 第 8 行。
    元素为整数的切片操作,与.loc不同,这里下标为 stop 的数据不被选择。如:df.iloc[0:3], 只包含 0,1,2行,不包含第 3 行。
    使用布尔数组进行筛选,如 df.iloc[np.array(df.A>0.5)],df.iloc[list(df.A>0.5)]。
    注意使用布尔数组进行筛选时,可以使用 list 或者 array,使用 Series会出错,NotImplementedError 和 ValueError,前者是 Series 的 index 与待切片 DataFrame的index 不同时报错,后置 index 相同时报错。
    与.loc使用布尔数组,可以使用 list, array, 也可以使用Series,使用Series时 index需要一致,否则会报 IndexError。

posted on 2020-12-21 22:13  markyle  阅读(1267)  评论(0编辑  收藏  举报