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索引器
loc
和 iloc
一样使用,只需把标量的位置替换成对应的元组即可,但需要先进行 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/
转载文章受原作者版权保护。转载请注明原作者出处!