返回介绍

数学基础

统计学习

深度学习

工具

Scala

三、 下标存取

发布于 2023-07-17 23:38:23 字数 12361 浏览 0 评论 0 收藏 0

1. [ ] 操作符

  1. 对于Index对象,可以通过[]来选取数据,它类似于一维ndarray的索引。下标可以为下列几种下标对象:

    • 一个整数下标。此时返回对应的label

    • 一个整数slice。此时返回对应的Index(根据一维labels先切片,再组装成Index

    • 一个array-like对象(元素可以为下标或者布尔值)。此时返回对应的Index。(根据一维labels先索引,再组装成Index

    • None组成的二元组,其中None相当于新建一个轴。

      • 如果None为第一个元素,则新建的轴为 0 轴;
      • 如果None为第二个元素,则新建的轴为 1 轴。
      • 另外idx[None]等价于idx[None,:],但是idx[None]返回的是ndarray
      • 它并没有将Index 转换成MultiIndex,只是将Index内部的数据数组扩充了一个轴

    Index 的索引只支持整数/整数slice/整数序列/布尔序列/整数数组/布尔数组/None 等。

    slect_sq_brackets_index

  2. 对于Series对象,可以通过[]来选取数据,它类似于一维ndarray的索引。下标可以为下列几种下标对象:

    • 一个整数下标/一个属性(属性名为某个label)/字典索引(键为label):返回对应的数值

    • 一个整数切片/一个label切片:返回对应的Series。(根据一维Series先切片,再组装成Series)。注意:label切片同时包含了起始label和终止label

    • 一个整数array-like/一个label array-like/一个布尔ndarray:返回对应的Series。(根据一维Series先索引,再组装成Series

    • 一个二维整数array-like/二维label array-like:返回对应值组成的二维ndarray

      注意:Series必须使用布尔数组来索引,不支持布尔序列来索引(抛出KeyError异常)。

    slect_sq_brackets_series1 slect_sq_brackets_series2

  3. 对于DataFrame对象,可以通过[]来选取数据。下标可以为下列几种下标对象:

    • 一个属性(属性名为某个column label)/字典索引(键为column label):返回对应的列对应的Series

      不可以使用单个整数来索引

    • 一个整数切片/一个row label切片:返回对应的行组成的DataFrame。注意:label切片同时包含了起始label和终止label

    • 一个一维label array-like:返回对应的列组成的DataFrame

    • 一个布尔数组:返回数组中True对应的行组成的DataFrame

    • 一个布尔DataFrame:将该布尔DataFrame中的False对应的元素设置为NaN(布尔DataFrame中没有出现的值为False

    slect_sq_brackets_df1 slect_sq_brackets_df2

  4. Series对象除了支持使用位置作为下标存取元素之外,还可以使用索引标签来存取元素。这个功能与字典类似,因此它也支持字典的一些方法,如Series.iteritems()iteritems

  5. 对于Series/DataFrame切片方式的索引,返回的结果与原始对象共享基础数据。对于采用其他方式的索引,返回的结果并不与元素对象共享基础数据。 same_base

  6. 对于DataFrame的赋值与列删除:

    • 将列表或者数组赋值给某个列时,其长度必须跟DataFrame的行数匹配。
    • 将标量赋值给某个列时,会将标量扩充
    • Series赋值给某个列时,会精确匹配DataFrame的索引。如果DataFrame中某个labelSeries中找不到,则赋值NaN(空位都将被填上缺失值)
    • 为不存在的列赋值会创建出一个新列(必须用字典的形式,不能用属性赋值的形式)
    • 关键字del用于删除列(必须用字典的形式,不能用属性赋值的形式)

    assign_1 assign_2

  7. 对于Series的赋值与删除:

    • 对于单个索引或者切片索引,要求右侧数值的长度与左侧相等
    • 为不存在的label赋值会创建出一个新行(必须用字典的形式,不能用属性赋值的形式)
    • 关键字del用于删除行(必须用字典的形式,不能用属性赋值的形式) assign
  8. 如果Series/DataFrame的索引有重复label,则数据的选取行为将有所不同:

    • 如果索引对应多个label,则Series返回一个SereisDataFrame返回一个DataFrame
    • 如果索引对应单个label,则Series返回一个标量值,DataFrame返回一个Series

    你可以通过Index.is_unique属性得知索引是否有重复的。

    • 对于[]、字典索引、属性索引或者.loc/.ix存取器,结论如上所述
    • 对于.at存取器:如果索引对应单个label,索引结果正常。如果索引对应多个label,则Series返回一个一维ndarrayDataFrame则抛出异常。 select_label_nounique select_label_nounique
  9. 对于Series/DataFrame,它们可以使用ndarray的接口。因此可以通过ndarray 的索引规则来索引它们。

    
    
    xxxxxxxxxx
    df=pd.DataFrame(...) df[:,0] #使用了 ndarray 的索引方式

2. loc/iloc/ix 存取器

  1. 对于Series.loc[]的下标对象可以为:

    • 单个label,此时返回对应的值
    • labelarray-likelabel slice以及布尔array-like:返回对应值组成的Series

    series_loc

  2. 对于DataFrame.loc[]的下标对象是一个元组,其中两个元素分别与DataFrame的两个轴对应。如果下标不是元组,则该下标对应的是第0轴,第一轴为默认值:

    • 每个轴的下标都支持单个labellabel array-likelabel slice、布尔array-like
    • 若获取的是某一列或者某一行,则返回的是Series;若返回的是多行或者多列,则返回的是DataFrame;如果返回的是某个值,则是普通的标量。

    select_loc_df1 select_loc_df2

  3. .iloc[].loc[]类似,但是.iloc[]使用整数下标,而不是使用label

    • 注意整数切片不包括最后一个值。

    select_iloc1 select_iloc2

  4. .ix[]存取器综合了.iloc/.loc:它可以混合使用label和位置下标

    • 注意:如果有整数索引,则应该使用.loc/.iloc从而避免混淆

    select_ix1 select_ix2

  5. Index对象不能使用loc/iloc/ix存取器

  6. 对于.loc/.iloc/.ix:如果某轴的索引为array-like或者布尔array-like,则返回的结果与原来的对象不再共享基础数据。如果轴的索引全部都是slice或者单个整数、单个label,则返回的结果与原来的对象共享基础数据。 select_data_share

3. at/iat 存取器

  1. .at.iat分别使用label和整数下标获取单个值。它类似于.loc/.iloc,但是.at/.iat的速度更快

    • 每个索引只能是单个label或者单个整数

    select_at_iat

  2. 对于DataFrame.lookup(row_labels, col_labels)类似于:.loc[row_labels, col_labels],但是.lookup返回的是一维ndarray

    • 要求row_labelscol_labels长度相同。(row_labels[0],col_labels[0]决定了结果中第一个元素的位置,...(row_labels[i],col_labels[i]决定了结果中第 i+1个元素的位置, select_lookup
  3. DataFrame.get_value(index, col, takeable=False)等价于.loc[index, col],它返回单个值。而Series.get_value(label, takeable=False)等价于.loc[label],它也返回单个值 select_get_value

  4. .get(key[, default])方法与字典的get()方法的用法相同。对于DataFramekeycol_label select_get

  5. .head([n=5]).tail([n=5])返回头部/尾部n行数据 select_head_tail

4. query 方法

  1. 对于DataFrame,当需要根据一定的条件对行进行过滤时,通常可以先创建一个布尔数组,然后使用该数组获取True对应的行。另一个方案就是采用query(expr, inplace=False, **kwargs)方法:

    • expr是个运算表达式字符串,如'label1 >3 and label2<5'
    • 表达式中的变量名表示对应的列,可以使用not/and/or等关键字进行向量布尔运算。该方法会筛选出那些满足条件的行。
    • 如果希望在表达式中使用Python变量,则在变量名之前使用@
    • inplace是个布尔值,如果为True,则原地修改。否则返回一份拷贝。 select_query

5. 多级索引

  1. 对于.loc/.ix/[],其下标可以指定多级索引中,每级索引上的标签。

    • 多级索引轴对应的下标是一个下标元组,该元组中每个元素与索引中每级索引对应
    • 如果下标不是元组,则将其转换成长度为 1 的元组
    • 如果元组的长度比索引的层数少,则在其后面补充slice(None) select_multiIndex1 select_multiIndex2 select_multiIndex3

6. 整数 label

  1. label不一定是字符串,也有可能是整数(如RangeIndex/Int64Index等)。尤其是当label是自动生成的时候。

    • 当你的label是整数时,面向整数的下标索引总是面向label的,而不是面向position的。因此推荐使用.loc来基于label索引,使用.iloc来基于position索引。

    Index_numlabel1 Index_numlabel2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文