“索引”类似一本书的目录(页码),通过目录(页码),让我们能快速找到想看的位置。对于一个DataFrame数据框,其中:

  • 行索引(Label index),是一条完整数据的索引,通过这个索引,能快速取出对应的某条数据记录。
  • 列索引(Columns Names),指向的是每一个Series。
  • 行是一条完整信息记录,索引在业务上一般不允许重复,好的索引能方便处理数据,重复的索引导入数据库可能出现限制,可以设置默认配置。
  • 无论是行索引还是列索引,在 Pandas 里其实都是一个** Index 对象,都有类似的属性方法**。
  • pandas的索引有不同的类型,目的都是为更方便处理数据。

  源Excel文件index.xlsx:
image

  • 未指定时,python会自动生成从0开始的行索引,列名默认为第1行
     pandas不知道你实际业务情况,所以只能自动生成0-N的自然索引。
  1. df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx')
  2. df

image

  • 自定义指定
  1. # 指定’姓名‘或’班级‘这一列为行索引
  2. df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx',index_col='姓名')
  3. # df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx',index_col='班级')
  4. df

image

  1. # 指定’班级‘、’姓名‘这两列为层级索引MultiIndex
  2. df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx',index_col=[1,0])
  3. df

image
 也可以根据header参数指定哪行作为列名,或根据names参数自定义列名,具体见:https://www.cnblogs.com/xiaoshun-mjj/p/14538695.html

  1. DataFrame.set_index(keys, drop=True, append=False,
  2. inplace=False, verify_integrity=False)

参数说明:

  • keys:列标签或列标签/列表/series,需要设置为索引的列;
  • drop:是否保留设置索引的原列。默认为True,不保留;
  • append:是否保留原索引。默认为False,不保留;
  • inplace:输入布尔值,表示当前操作是否对原数据生效,默认为False。
  • verify_integrity:检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为false将提高该方法的性能,默认为false。
  1. # 导入数据时,未指定索引
  2. df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx')
  3. df.set_index('姓名') # 设置姓名为索引
  4. df.set_index(['班级','姓名']) # 设置班级和姓名为索引

image

  1. df.set_index('姓名',drop=False) # 保留原列
  2. df.set_index('姓名',append=True) # 保留原索引

image

以df.index为例,也适用于 df.columns, 因为两者都是 index 对象

  1. df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx') # 导入数据时,未指定索引
  2. df.set_index('姓名',drop=False,inplace=True) # 保留原列,对原数据生效
  3. # 查看索引信息(值和类型,还有可能有名称)
  4. df.columns
  5. df.index

image

  1. df.index.name # 行索引名称
  2. df.index.dtype # 索引数据类型
  3. df.index.shape # 形状
  4. df.index.size # 元素数量,行记录条数
  5. # df.columns.size
  6. df.index.values # 索引的值,array 数组
  7. # df.index.value_counts() # 去重统计
  8. # df.index.values.tolist() # array 数组转换成列表list
  9. df.index.is_unique # 判断是否有重复,业务上原则一般不会重复,有重复返回False

一样适用于 df.columns。

  1. df.columns.isin(['姓名','语文']) # 是否存在,快速查看是否有该列名或行

image

  1. df.index.nunique() # 不重复值的数量
  2. df.index.sort_values(ascending=False) # 排序,倒序
  3. df.index.to_frame(index=False) # 转成 DataFrame
  4. df.index.unique() # 去重
  5. df.index.value_counts() # 去重分组统计
  6. df.index.where(df.index=='林*') # 筛选,查看是否由该行记录
  7. df.index.max() # 最大值
  8. df.index.map(lambda x:x+'_') # 批量处理索引

image

列可以变成索引,索引也能回复成列。

  1. DataFrame.reset_index(level=None, drop=False,
  2. inplace=False, col_level=0, col_fill='')

参数说明:

  • level:数值类型可以为:int、str、tuple或list,默认无,仅从索引中删除给定级别。默认情况下移除所有级别。控制了具体要还原的那个等级的索引 。
  • drop:当指定drop=False时,则索引列会被还原为普通列;否则,经设置后的新索引值被会丢弃。默认为False。
  • inplace:输入布尔值,表示当前操作是否对原数据生效,默认为False。
  • col_level:数值类型为int或str,默认值为0,如果列有多个级别,则确定将标签插入到哪个级别。默认情况下,它将插入到第一级。
  • col_fill:对象,默认‘’,如果列有多个级别,则确定其他级别的命名方式。如果没有,则重复索引名。
  1. df = pd.read_excel('C:/Users/asus/Desktop/index.xlsx') # 导入数据时,未指定索引
  2. df = df.set_index(['姓名','班级']) # 设置MultiIndex
  3. df

image

  1. df.reset_index() # 移除所有层级索引,并把索引还原成列
  2. df.reset_index(drop=True) # 移除所有层级索引,舍弃原索引
  3. df.reset_index(['姓名']) # 只把姓名这一层索引还原层列

image

  1. # 一对一对应修改
  2. df.rename(columns={'数学': 'maths'})
  3. # 也可以通过一些函数进行批量修改
  4. df.rename(lambda x:'t_' + x, axis=1) # 通过lambda表达式批量给列名加前缀

版权声明:本文为xiaoshun-mjj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaoshun-mjj/p/14679408.html