Pandas03--索引

本文详细介绍了Pandas中的索引操作,包括列索引、行索引、loc和iloc索引器的使用,多级索引的创建、操作及查询,以及索引的运算和常用方法。通过实例解析了query方法、随机抽样,以及如何进行多级索引的构造和变换。此外,还探讨了集合运算在索引中的应用。
摘要由CSDN通过智能技术生成


1 索引器

1.1 表的列索引

  • 基础用法:通过[ ]实现,通过[列名]可以从 DataFrame中取出相应的列,返回值为 Series
    【例子】从表中取出姓名一列
    import pandas as pd
    import numpy as np
    df = pd.read_csv('data/learn_pandas.csv',
                 usecols = ['School', 'Grade', 'Name', 'Gender',
                            'Weight', 'Transfer'])
    print(df['Name'].head())
    
    0      Gaopeng Yang
    1    Changqiang You
    2           Mei Sun
    3      Xiaojuan Sun
    4       Gaojuan You
    Name: Name, dtype: object
    
  • 取出多个列:通过[列名组成的列表] ,其返回值为一个DataFrame
    【例子】从表中取出性别和姓名两列
    print(df[['Gender', 'Name']].head())
    
    Gender            Name
    0  Female    Gaopeng Yang
    1    Male  Changqiang You
    2    Male         Mei Sun
    3  Female    Xiaojuan Sun
    4    Male     Gaojuan You
    
  • 取出单列的另外方法:取出单列,且列名中不包含空格,则可以用.列名取出,这和[列名] 是等价的
    df.Name.head()

1.2 序列的行索引

  • 以字符串为索引:
    • 语法:取出单个索引的对应元素,用[item];取出多个用[items的列表];取出某两个索引之间的元素,且这两个索引是在整个索引中唯一出现,则可以使用切片。

    注意:这里的切片会包含两个端点

    • 用法:若Series 只有单个值对应,则返回这个标量值,如果有多个值对应,则返回一个 Series
    • 【例子】
    s = pd.Series([1, 2, 3, 4, 5, 6],
    				index=['a', 'b', 'a', 'a', 'a', 'c'])
    print(s['a']) # 取出单个,多值对应
    print(s['b']) # 取出单个,单值对应
    print(s[['c', 'b']] # 取出多个索引的对应元素
    print(s['c': 'b': -2]) # 切片
    
    a    1
    a    3
    a    4
    a    5
    dtype: int64
    
    2
    
    c    6
    b    2
    dtype: int64
    
    c    6
    a    4
    b    2
    dtype: int64
    
  • 以整数为索引:
    • 语法:使用 [int] 或 [int_list] ,则可以取出对应索引元素的值
    • 用法:和字符串一样使用,特别的是,如果不特别指定所对应的列作为索引,那么会生成从0开始的整数索引作为默认索引。

    注意:使用整数切片,同 Python 中的切片一样不包含右端点。

    • 【例子】
    s = pd.Series(['a', 'b', 'c', 'd', 'e', 'f'],
    			 index=[1, 3, 1, 2, 5, 4])
    print(s[[2,3]])
    print(s[1:-1:2]) # 整数切片
    
    2    d
    3    b
    dtype: object
    
    3    b
    2    d
    dtype: object
    

注意:不要把纯浮点以及任何混合类型(字符串、整数、浮点类型等的混合)作为索引,否则可能会在具体的操作时报错或者返回非预期的结果

1.3 loc索引器

  • 行的索引器:一种是基于 元素loc 索引器,另一种是基于 位置iloc索引器。

  • loc索引器:

    • 形式:一般形式是 loc[*, *],其中第一个*代表行的选择,第二个 *代表列的选择,如果省略第二个位置写作loc[*],这个*是指行的筛选。
    • *参数对象:
      1.单个元素 2.元素列表 3.元素切片 4.布尔列表 5.函数
  • *为单个元素:

    • 用法:直接取出相应的行或列,如果该元素在索引中重复则结果为DataFrame,否则为Series
    • 【例子】
    # 只选择行
    print(df_demo.loc['Qiang Sun']) # 多个人叫此名字
    print(df_demo.loc['Quan Zhao']) # 名字唯一
    
                                      School      Grade  Gender  Weight Transfer
    Name                                                                        
    Qiang Sun            Tsinghua University     Junior  Female    53.0        N
    Qiang Sun            Tsinghua University  Sophomore  Female    40.0        N
    Qiang Sun  Shanghai Jiao Tong University     Junior  Female     NaN        N
    
    School      Shanghai Jiao Tong University
    Grade                              Junior
    Gender                             Female
    Weight                                 53
    Transfer                                N
    Name: Quan Zhao, dtype: object
    
    # 同时选择行和列
    print(df_demo.loc['Qiang Sun', 'School') # 返回Series
    print(df_demo.loc['Quan Zhao', 'School']) # 返回单个元素
    
    Name
    Qiang Sun              Tsinghua University
    Qiang Sun              Tsinghua University
    Qiang Sun    Shanghai Jiao Tong University
    Name: School, dtype: object
    
    'Shanghai Jiao Tong University'
    
  • *为元素列表:

    • 【例子】 取出列表中所有元素值对应的行或列
    df_demo.loc[['Qiang Sun','Quan Zhao'], ['School','Gender']]
    
                                      School  Gender
    Name                                            
    Qiang Sun            Tsinghua University  Female
    Qiang Sun            Tsinghua University  Female
    Qiang Sun  Shanghai Jiao Tong University  Female
    Quan Zhao  Shanghai Jiao Tong University  Female
    
  • *为元素切片:

    • 使用条件:必须是唯一值的起点和终点字符/数值
    • 注意:字符串切片包含两个端点,整数切片只包含起点。
    • 【例子】
    # 字符串索引
    print(df_demo.loc['Gaojuan You':'Gaoqiang Qian', 'School':'Gender'])
    
    # 整数索引
    print(df_loc_slice_demo.loc[5:3]
                                          School      Grade  Gender
    Name                                                           
    Gaojuan You                 Fudan University  Sophomore    Male
    Xiaoli Qian              Tsinghua University   Freshman  Female
    Qiang Chu      Shanghai Jiao Tong University   Freshman  Female
    Gaoqiang Qian            Tsinghua University     Junior  Female
    
                              School   Grade  Gender  Weight Transfer
    5               Fudan University  Junior  Female    46.0        N
    4            Tsinghua University  Senior  Female    50.0        N
    3  Shanghai Jiao Tong University  Senior  Female    45.0        N
    
  • *为布尔列表:

    • 用法:传入loc的布尔列表与 DataFrame 长度相同,且列表为 True 的位置所对应的行会被选中,False则会被剔除
    • 【例子】选出体重超过70kg的学生
    df_demo.loc[df_demo.Weight>70].head()
    
                                          School      Grade Gender  Weight Transfer
    Name                                                                           
    Mei Sun        Shanghai Jiao Tong University     Senior   Male    89.0        N
    Gaojuan You                 Fudan University  Sophomore   Male    74.0        N
    Xiaopeng Zhou  Shanghai Jiao Tong University   Freshman   Male    74.0        N
    Xiaofeng Sun             Tsinghua University     Senior   Male    71.0        N
    Qiang Zheng    Shanghai Jiao Tong University     Senior   Male    87.0        N
    

    注意:对于复合条件,可以用 |(或), &(且),~(取反) 的组合来实现

  • *为函数:

    • 使用条件:必须以前面的四种合法形式之一为返回值,并且函数的输入值为 DataFrame本身
    • 【例子1】可以把逻辑写入一个函数中再返回,需要注意的是函数的形式参数 x本质上即为 df_demo
    '''
    选出复旦大学中体重超过70kg的大四学生,
    或者北大男生中体重超过80kg的非大四的学生
    '''
     def condition(x):
     	... ...
     	return result
     df_demo.loc[condition]
    
    	                           School     Grade Gender  Weight Transfer
    Name                                                               
    Qiang Han       Peking University  Freshman   Male    87.0        N
    Chengpeng Zhou   Fudan University    Senior   Male    81.0        N
    Changpeng Zhao  Peking University  Freshman   Male    83.0        N
    Chengpeng Qian   Fudan University    Senior   Male    73.0        Y
    
    • 【例子2】支持使用lambda表达式,其返回值也同样必须是先前提到的四种形式之一
    df_demo.loc[lambda x:'Quan Zhao', lambda x:'Gender']
    # 'Female'
    
    • 【例子3】函数无法返回如start: end: step的切片形式,故返回切片时要用 slice对象进行包装
    df_demo.loc[lambda x: slice('Gaojuan You', 'Gaoqiang Qian')]
    # 结果和*参数为切片的结果一样
    

注意:
1.对于 Series 也可以使用 loc索引,其遵循的原则与 DataFrame中用于行筛选的 loc[*] 完全一致
2.在对表或者序列赋值时,应当在使用一层索引器后直接进行赋值操作,这样做是由于进行多次索引后赋值是赋在临时返回的 copy 副本上的,而没有真正修改元素从而报出 SettingWithCopyWarning警告

1.4 iloc索引器

  • 用法:iloc 的使用与 loc 完全类似,只不过是针对位置进行筛选,
  • *参数:在相应的 * 位置处一共也有五类合法对象,分别是:整数整数列表、整数切片、布尔列表以及函数(函数的返回值必须是前面的四类合法对象中的一个,其输入同样也为 DataFrame 本身)。
  • 【例子】
    # 整数
    df_demo.iloc[1, 1] # 第二行第二列
    # 'Freshman'
    
    # 整数列表
    df_demo.iloc[[0, 1], [0, 1]] # 前两行前两列
    '''
                                           School     Grade
    Name                                                   
    Gaopeng Yang    Shanghai Jiao Tong University  Freshman
    Changqiang You              Peking University  Freshman
    '''
    # 整数切片
    df_demo.iloc[1: 4, 2:4] # 切片不包含结束端点
    '''
                    Gender  Weight
    Name                          
    Changqiang You    Male    70.0
    Mei Sun           Male    89.0
    Xiaojuan Sun    Female    41.0
    '''
    # 函数
    df_demo.iloc[lambda x: slice(1, 4)] # 传入切片为返回值的函数
    '''
                                           School      Grade  Gender  Weight Transfer
    Name                                                                             
    Changqiang You              Peking University   Freshman    Male    70.0        N
    Mei Sun         Shanghai Jiao Tong University     Senior    Male    89.0        N
    Xiaojuan Sun                 Fudan University  Sophomore  Female    41.0        N
    '''
    
    • 布尔列表:不能传入Series而必须传入序列的values ,否则会报错。因此,在使用布尔筛选的时候还是应当优先考虑 loc 的方式。
      【例子】选出体重超过80kg的学生
    df_demo.iloc[(df_demo.Weight>80).values].head()
    
                                           School      Grade Gender  Weight Transfer
    Name                                                                            
    Mei Sun         Shanghai Jiao Tong University     Senior   Male    89.0        N
    Qiang Zheng     Shanghai Jiao Tong University     Senior   Male    87.0        N
    Qiang Han                   Peking University   Freshman   Male    87.0        N
    Chengpeng Zhou               Fudan University     Senior   Male    81.0        N
    Feng Han        Shanghai Jiao Tong University  Sophomore   Male    82.0        N
    

1.5 query方法

  • 用法:在pandas 中,支持把字符串形式的查询表达式传入 query方法来查询数据,其表达式的执行结果必须返回布尔列表

1.6 随机抽样

  • sample函数:如果把DataFrame的每一行看作一个样本,或把每一列看作一个特征,再把整个DataFrame看作总体,想要对样本或特征进行随机抽样就可以用sample 函数
    • 主要参数:n, axis, frac, replace, weights,前三个分别是指抽样数量、抽样的方向(0为行、1为列)和抽样比例(0.3则为从总体中抽出30%的样本)
    • replace 和 weights分别是指是否放回和每个样本的抽样相对概率&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值