DataWhale-Pandas-Task3
本文最后更新于 384 天前,其中的信息可能已经有所发展或是发生改变。

三、索引

3.1 索引器

3.1.1 表的列索引

在Pandas中,列索引是最常见的索引形式,一般通过[]来实现。通过[列名]可以从DataFrame中取出相应的列,返回值为Series;也可以通过df[['Gender', 'Name']].head()进行输出,例如从表中取出姓名一列:

df = pd.read_csv('E:/pandas/data/learn_pandas.csv', usecols = ['School', 'Grade', 'Name', 'Gender', 'Weight', 'Transfer'])
print(df['Name'].head())
print('-' * 50)

显示结果如下:

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

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

3.1.2 序列的行索引

  • 以字符串为索引的 Series,取出单个索引的对应元素,则可以使用[item],可以使用切片
    注: 如果前后端点的值存在重复,即非唯一值,那么需要经过排序才能使用切片,如 s.sort_index()[‘a’: ‘b’]
  • 以整数为索引的 Series,使用 [int] 或 [int_list] ,则可以取出对应索引元素的值

3.1.3 loc索引器

loc[*, *]:第一个* 代表行的选择,第二个*代表列的选择
注: 对于复合条件而言,可以用 |(或), &(且), ~(取反)的组合来实现,不要使用链式赋值,如df_chain[df_chain.A!=0].B = 1应改为df_chain.loc[df_chain.A!=0,'B'] = 1

3.1.4. iloc索引器

iloc 的使用与 loc 完全类似,只不过是针对位置进行筛选,在相应的 * 位置处也有五类对象:整数、整数列表、整数切片、布尔列表以及函数

3.1.5. query方法

在pandas中,支持把字符串形式的查询表达式传入query方法来查询数据,其表达式的执行结果必须返回布尔列表。在进行复杂索引时,由于这种检索方式无需像普通方法一样重复使用DataFrame的名字来引用列名,一般而言会使代码长度在不降低可读性的前提下有所减少。

例如,将loc一节中的复合条件查询例子可以如下改写:

print(df.query('((School == "Fudan University")&'
         ' (Grade == "Senior")&'
         ' (Weight > 70))|'
         '((School == "Peking University")&'
         ' (Grade != "Senior")&'
         ' (Weight > 80))'))

显示结果为:

注意: 对于含有空格的列名,需要使用col name的方式进行引用。

query中还有许多英文的字面用法,比如:or,and,is in等等,比如下面筛选出男生中是大一而不是大二的学生:

print(df.query('(Grade not in ["Freshman", "Sophomore"]) and (Gender == "Male")').head())

显示结果为:

而如果要引用外部变量,只需在变量名前加@符号。例如,取出体重位于70kg到80kg之间的学生:

low, high =70, 80
print(df.query('Weight.between(@low, @high)').head())

3.1.6 随机抽样

sample 函数中的主要参数为:

  • n: 抽样数量
  • axis: 抽样的方向 (0为行、1为列)
  • frac: 抽样比例(0.3则为从总体中抽出30%的样本)
  • replace: 是否放回
  • weights: 每个样本的抽样相对概率

3.2 多级索引

3.2.1 多级索引及其表的结构

下图通过颜色区分,标记了 DataFrame 的结构。与单层索引的表一样,具备元素值、行索引和列索引三个部分。其中,这里的行索引和列索引都是 MultiIndex 类型,只不过 索引中的一个元素是元组 而不是单层索引中的标量。例如,行索引的第四个元素为 (“B”, “Male”) ,列索引的第二个元素为 (“Height”, “Senior”) ,这里需要注意,外层连续出现相同的值时,第一次之后出现的会被隐藏显示,使结果的可读性增强。

索引的名字和值属性分别可以通过 namesvalues 获得:
df_multi.index.names; df_multi.index.values

3.2.2 多级索引中的loc索引器

由于多级索引中的单个元素以元组为单位,因此之前在第一节介绍的loc和iloc方法完全可以照搬,只需把标量的位置替换成对应的元组,不过在索引前最好对MultiIndex进行排序以避免性能警告:

df_multi = df_multi.sort_index()
df_multi.loc[('Fudan University', 'Junior')].head()
print('-' * 50)

3.2.3 IndexSlice对象

前面介绍的方法只能对元组整体进行切片,不能对每层进行切片,也不能将切片和布尔列表混合使用,而引入IndexSlice对象就能解决这个问题。Slice对象一共有两种形式,第一种为loc[idx[*,*]]型,第二种为loc[idx[*,*],idx[*,*]]型。

3.2.4 多级索引的构造

前面提到了多级索引表的结构和切片,那么除了使用set_index之外,还可以通过from_tuples, from_arrays, from_product三种方法,它们都是pd.MultiIndex对象下的函数。

3.3 索引的常用方法

3.3.1 索引层的交换和删除

索引层的交换由swaplevelreorder_levels 完成,前者只能交换两个层,而后者可以交换任意层,两者都可以指定交换的是轴是哪一个,即行索引或列索引
删除某一层的索引,可以使用 droplevel 方法

3.3.2 索引属性的修改

通过rename_axis 可以对索引层的名字进行修改,常用的修改方式是传入字典的映射
例子:
df_ex.rename_axis(index={'Upper':'Changed_row'},columns={'Other':'Changed_Col'})

通过 rename 可以对索引的值进行修改,如果是多级索引需要指定修改的层号level

(未整理完,后期待补)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇