Pandas分类总结之:索引

1.1 表的列索引

df[列名] ,返回值为 Series,当列名不包含空格,可用 df.列名 取出

df[[列名组成的列表]] ,返回值为 DataFrame

1.2 序列的行索引

1.3 loc索引器

df.loc[*, *] 基于元素的loc索引器,第一个 *代表行的选择,第二个 *代表列的选择,如果省略第二个,就是行筛选

* 位置一共有五类合法对象,分别是:

  • df.loc[单个元素]
  • eg1: df.loc['row_name']df.loc['col_name'],如果该元素在索引中重复则结果为 DataFrame,否则为 Series
  • eg2: df.loc['row_name', 'clo_name'],如果该元素在索引中重复则结果为 Series,否则为单个元素
  • df.loc[元素列表]
  • eg1: df.loc[['row_name1','row_name2',...],['clo_name1','clo_name2',...]],取出列表中所有元素值对应的行或列
  • df.loc[元素切片]
  • eg1: df.loc['row_namex':'row_namey', 'clo_namex':'clo_namey'],字符切片,如果是唯一值的起点和终点字符才可以使用切片,且包含两个端点
  • eg2: df.loc[3:5],整数切片,如果是唯一值的起点和终点数字才可以使用切片,且包含两个端点
  • df.loc[布尔列表]
  • 传入 loc的布尔列表要与 DataFrame长度相同
  • eg1: df.loc[df.clo_name > num]
  • eg2: df.loc[df.col_name.isin(['name1','name2'])]
  • eg3: df.loc[condition1 & condition2],复合条件可用 |(或), &(且), ~(取反)的组合来实现
  • df.loc[函数]
  • 函数结果必须以前面的四种合法形式之一为返回值
  • eg1: df.loc[funcation(x)],函数的形式参数 x本质上即为 df_demo
  • eg2: df.loc[lambda x:'name1',lambda x:'name2']
  • select_dtypes # 从表中选出相应类型的列
  • eg1: df.select_dtypes('number') ,选出所有数值型的列

1.4 iloc索引器

df.iloc[*, *] 基于位置的iloc索引器,第一个 *代表行的选择,第二个 *代表列的选择,如果省略第二个,就是行筛选

* 位置一共有五类合法对象,分别是:

  • df.iloc[整数]
  • eg1: df.iloc[1,1] ,第二行第二列
  • df.iloc[整数列表]
  • eg1: df.iloc[[0,1],[0,1]],前两行前两列
  • df.iloc[整数切片]
  • eg1: df.iloc[1: 4, 2:4] ,切片不包含结束端点
  • df.iloc[布尔列表]
  • eg1: df.iloc[(df.clo_name > num).values],不能传入 Series而必须传入序列的 values
  • df.iloc[函数]
  • eg1: df.iloc[lambda x: slice(1, 4)]

1.5 query方法

把字符串形式的查询表达式传入 query方法来查询数据,其表达式的执行结果必须返回布尔列表。

  • eg:

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

df.query('Weight > Weight.mean()')
  • 注意:
  • 对于含有空格的列名,需要使用 col name的方式进行引用
  • 条件关系可用 or, and, or, in, not in,eg: df.query('(condition1) and (condition2)')
  • 字符串中出现与列表的比较时, ==等价于in、 != 等价于not in,eg: df.query('clo_name== ["name1", "name2"]')
  • 引用外部变量,只需在变量名前加 @符号

1.6 随机抽样

df.sample(n,
         axis,
         frac,
         replace,
         weights

2.1 多级索引和表的结构

索引中的一个元素是元组而不是单层索引中的标量

  • df_multi.index.names/values,获取行索引名字/值属性
  • df_multi.columns.names/values,获取列索引名字/值属性
  • df_multi.index.get_level_values(0),获取某一层的索引

2.2 多级索引中的loc索引器

lociloc一样使用,只需把标量的位置替换成对应的元组即可,但需要先进行 df_multi.sort_index()(索引排序)以避免性能警告。

  • eg1: df_sorted.loc[('row_name1', 'row_name2')]
  • eg2: df_sorted.loc[[('row_name1', 'row_name2'), ('row_name3', 'row_name4')]]
  • eg3: df_sorted.loc[df_sorted.clo_name1> 70]
  • eg4: df_sorted.loc[lambda x:('row_name1','row_name2')]
  • eg5: df_sorted.loc[('row_name1', 'row_name2'):],切片索引,无论元组在索引中是否重复出现,都必须经过排序才能使用切片
  • eg6: df_sorted.loc[(['row_name1', 'row_name2'], ['row_name3', 'row_name4']),:],可以对多层的元素进行交叉组合后索引,同时需要指定 loc的列(全选则用 :表示)

2.3 IndexSlice对象

Slice对象一共有两种形式,第一种为 loc[idx[*,*]]型,第二种为 loc[idx[*,*],idx[*,*]]型,需要先定义 idx = pd.IndexSlice,才能使用slice,

  • loc[idx[*,*]]
  • eg1: df_ex.loc[idx['C':, ('D', 'f'):]] ,前一个 *表示行的选择,后一个 *表示列的选择
  • eg2: df_ex.loc[idx[:'A', 'b':], idx['E':, 'e':]] ,,前一个 idx指代的是行索引,后一个是列索引

2.4 多级索引的构造

  • pd.MultiIndex.from_tuples(my_tuple, names=['First','Second']),根据传入由元组组成的列表进行构造
  • pd.MultiIndex.from_arrays(my_array, names=['First','Second']),根据传入列表中,对应层的列表进行构造
  • pd.MultiIndex.from_product([my_list1, my_list2], names=['First','Second']),根据给定多个列表的笛卡尔积进行构造

3.1 索引层的交换和删除

  • 索引层的交换
  • df_ex.swaplevel(0,2,axis=1).head(),只能交换两个层,列索引的第一层和第三层交换
  • df_ex.reorder_levels([2,0,1],axis=0).head(),可以交换任意层,列表数字指代原来索引中的层
  • 索引层的删除
  • df_ex.droplevel(1,axis=1),删除某一层的索引
  • df_ex.droplevel([0,1],axis=0),删除某些层的索引

3.2 索引属性的修改

  • 索引层的名字修改
  • df_ex.rename_axis(index={'row_old':'row_new'}, columns={'col_old':'col_new'}),索引层的名字进行修改,修改方式是传入字典的映射
  • 索引层的值修改
  • df_ex.rename(columns={'cat':'not_cat'}, level=2),对索引的值进行修改,如果是多级索引需要指定修改的层号 level
  • df_ex.rename(index=lambda x:str.upper(x), level=2),传入参数也可以是函数,其输入值就是索引元素
  • map函数,定义在 Index上的方法,直接传入索引的元组,进行跨层的修改提供了遍历
  • new_idx = df_temp.index.map(lambda x: (x[0], x[1], str.upper(x[2])))
  • new_idx = df_temp.index.map(lambda x: (x[0]+'-'+x[1]+'-'+x[2])),对多级索引的压缩
  • new_idx = df_temp.index.map(lambda x:tuple(x.split('-'))),索引反向地展开

3.3 索引的设置与重置

  • set_index()索引的设置
  • df.set_index('row_name',append=True),其主要参数是 append,表示是否来保留原来的索引,直接把新设定的添加到原索引的内层
  • df.set_index(['row_name1','row_name2'])
  • df.set_index(['row_name1',my_index]),在参数中可以传入相应的 Series作为索引
  • reset_index()索引的重置
  • df.reset_index(),重置了所有的索引,重新生成一个默认索引
  • df.reset_index('row_name',drop=True),其主要参数是 drop,表示是否要把去掉的索引层丢弃,而不是添加到列中

3.4 索引的变形

df_reindex.reindex()

4.1 一般的索引运算

先用 unique 去重后再进行运算

  • df1.intersection(df2),取索引交集
  • df1.union(df2),取索引并集
  • df1.difference(df2),取索引差
  • df1.symmetric_difference(df2),取索引补

Original: https://blog.csdn.net/KEEP_GIONG/article/details/120044389
Author: Seven_0507
Title: Pandas分类总结之:索引

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/679395/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球