文章目录
- 一、索引是什么?
- 二、set_index()
- 三、reset_index()
一、索引是什么?
在进行数据分析时,通常我们要根据业务情况进行数据筛选,要求筛选特定情况的行或列,这时就要根据数据类型(Series或者DataFrame)的索引情况对数据进行相应的行切片或者列索引的处理。
在Pandas中最常用的就是数据类型就是Series和DataFrame,它们的索引情况如下:
Series
- 索引(index):对应是最左侧那一列。
- 值(values):每一个索引的右侧对应一个值。
DataFrame有两种索引
- 行索引(index):对应最左边的那一列。
- 列索引(columns):对应最上面的那一横行。
关于DataFrame索引的具体使用方法可以参考:
python数据分析的基础知识—pandas中dataframe()使用目录下的DataFrame切片与索引
二、set_index()
功能:指定数据表中的某列或指定某个数组列表为DataFrame行索引。
函数语法
DataFrame.set_index(keys, *, drop=True, append=False, inplace=False, verify_integrity=False)
参数说明
- key:数据表中的某列/列标签列表/数组列表,需要设置为索引的列。
- drop:删除用作新索引的列,默认为True,删除。
- append:是否将列附加到现有索引,默认为False,否。
- inplace:表示当前操作是否对原数据重新,默认为False,否。
- verify_integrity:检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为False,将提高该方法的性能,默认为False。
举例
模拟样本数据
import pandas as pd
import numpy as np
data=pd.DataFrame({'A':['apple','orange','grape','pear'],
'B':[1000,2300,4000,5000],
'C':[12,34,23,67]})
data
-
将A列这一列作为行索引
-
- key为数据表某一列
data_1=data.set_index('A')
data_1
-
- key为数据表某几列
data_1=data.set_index(['A','B'])
data_1
- key为数组列表
data_1=data.set_index([pd.Index([1,2,3,4])])
data_1
data_1=data.set_index([pd.Series([1,2,3,4])])
data_1
-
- drop=True,默认。
data_1=data.set_index('A',drop=True,append=False,inplace=False,verify_integrity=False)
data_1
-
- drop=False
data_1=data.set_index('A',drop=False,append=False,inplace=False,verify_integrity=False)
data_1
对比drop=True和drop=False,可以看到,drop=False时,被作为行索引的那一列数据仍然被保留下来了。
-
- append=False,默认。
data_1=data.set_index('A',drop=True,append=False,inplace=False,verify_integrity=False)
data_1
-
- append=True
data_1=data.set_index('A',drop=True,append=True,inplace=False,verify_integrity=False)
data_1
对比append=True和append=False,可以看到,append=True时,原来行索引和新的行索引一起被保留下来了。
三、reset_index()
功能:reset_index()方法可能最经常使用的地方是处理groupby()方法调用后的数据。主要可以将数据表中的索引还原为普通列并重新变为默认的整型索引。
函数语法
DataFrame.reset_index(level=None, *, drop=False, inplace=False, col_level=0, col_fill=‘’, allow_duplicates=_NoDefault.no_default, names=None)[source]
参数说明
- key:数值类型可以为:int、str、tuple或list,默认无。
- drop:当指定drop=False(默认为False)时,则索引列会被还原为普通列;否则,如设置为True,原索引列会被丢弃。
- inplace:表示当前操作是否对原数据重新,默认为False,否。
- col_level:数值类型为int或str,默认值为0,如果列有多个级别,则确定将标签插入到哪个级别。默认情况下,它将插入到第一级。
- col_fill:对象,默认‘’,如果列有多个级别,则确定其他级别的命名方式。如果没有,则重复索引名。
举例
模拟样本数据
import pandas as pd
import numpy as np
data=pd.DataFrame({'A':['apple','orange','grape','pear'],
'B':[1000,2300,4000,5000],
'C':[12,34,23,67]})
data
reset_index()有两种情况:第一种对原来的数据表进行reset,第二种是对使用过的set_index()函数进行reset。
-
第一种:对原来的数据表进行reset
-
- 默认 drop=False
data_1=data.reset_index()
data_1
原来索引值[0, 1, 3]被还原成了普通列,同时被系统冠名为index字段。
-
- drop=True
data_1=data.reset_index(drop=True)
data_1
可以看到,输出结果和原来的数据表没有区别。但是其实在这个时候是有操作的,是在原有的索引列重置索引,同时不另外添加新列。下面举例1能比较直观感受到重置索引的操作。
举例1:重置索引的操作
重新创建数据表
import pandas as pd
import numpy as np
data=pd.DataFrame({'A':['apple','orange','grape','pear'],
'B':[1000,2300,4000,5000],
'C':[12,34,23,67]})
data
删除索引值为1的行,实际上就是第二行。
data.drop(labels=1,axis=0,inplace=True)
data
如果同样的代码再删除一次,就会报下面的错误
data.drop(labels=1,axis=0,inplace=True)
data
报错原因:一个数据表里一共有4行,我们把第2行给删掉了,就会顺道对应把索引1删掉,这时候数据的索引就会变成[1、2、3],即使这个时候原来的第3行数据现在变成第2行了,现在也无法用索引第2行的方式来获取现在的第2行(原来的第3行),因为索引已经乱了。
我们该如何解决这个问题呢?
答案:要将索引重置,这样后面再次使用才不会因为索引不存在而报错。重置索引的方法是:reset_index()。
reset_index(),默认(drop = False),当我们指定(drop = True)时,则不会保留原来的index,会直接使用重置后的索引。
data.reset_index(drop=True,inplace=True)
data
再试试删除索引值为1,代码就可以运行成功。
data.drop(labels=1,axis=0,inplace=True)
data
举例2:groupby()方法调用后的dataframe使用reset
import pandas as pd
import numpy as np
data=pd.DataFrame({'A':['apple','orange','orange','pear'],
'B':[1000,2300,4000,5000],
'C':[12,34,23,67]})
data
data_1=data.groupby('A')[['B','C']].mean()
data_1
data_1.reset_index()
- 第二种:对使用过的set_index()函数进行reset。
data_1=data.set_index('A')
data_1
-
- drop=False,默认。
data_1.reset_index(drop=False)
-
- drop=True
data_1.reset_index(drop=True)
对比drop=True和drop=False,可以看到,drop=False时,A列刚刚被作为索引列,被还原成原来的样子。当drop=True时,A列被删除了。
参考文章:
set_index官方文档
reset_index官方文档
https://zhuanlan.zhihu.com/p/110819220
http://anders.wang/pandaszhong-set_index-he-reset_index-yi-ji-reindex-qu-bie/