df.set_index() 使用现有列设置单(复合)索引,df.reset_index()还原索引
set_index
DataFrame可以通过set_index方法,可以使用现有列设置单索引和复合索引
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
参数:
- keys:label or array-like or list of labels/arrays,这个是需要设置为索引的列名,可以是单个列名,或者是多个列名
- drop:bool, default True,删除要用作新索引的列
- append:bool, default False,添加新索引
- inplace:bool, default False,是否要覆盖数据集
- verify_integrity:bool, default False,检查新索引是否重复。否则,将检查推迟到必要时进行。设置为False将改善此方法的性能
注意:drop为False,inplace为True时,索引将会还原为列
官网例子
df = pd.DataFrame({'month': [1, 4, 7, 10], 'year': [2012, 2014, 2013, 2014], 'sale': [55, 40, 84, 31]}) #设置单个列作为索引 df.set_index('month') ''' year sale month 1 2012 55 4 2014 40 7 2013 84 10 2014 31 ''' #设置复合索引 df.set_index(['year', 'month']) ''' sale year month 2012 1 55 2014 4 40 2013 7 84 2014 10 31 ''' #自定义索引和某列作为复合索引 df.set_index([pd.Index([1, 2, 3, 4]), 'year']) ''' month sale year 1 2012 1 55 2 2014 4 40 3 2013 7 84 4 2014 10 31 ''' #自定义索引 s = pd.Series([1, 2, 3, 4]) df.set_index([s, s**2]) ''' month year sale 1 1 1 2012 55 2 4 4 2014 40 3 9 7 2013 84 4 16 10 2014 31 '''
reset_index
多用于删除某行后重新设置0开始的索引
reset_index,重置DataFrame的索引,并使用默认索引。如果DataFrame具有MultiIndex,则此方法可以删除一个或多个级别
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)
参数:
- level:int, str, tuple, or list, default None,仅从索引中删除给定的级别。默认情况下删除所有级别。
- drop:bool, default False,drop为False则索引列会被还原为普通列,否则会丢失
- inplace:bool, default False
- col_level:int or str, default 0,如果列有多个级别,请确定将标签插入到哪个级别。默认情况下,它被插入第一级
- col_fill:object, default ‘’,如果列有多个级别,请确定如何命名其他级别。如果为None,则重复索引名称
官网例子
df = pd.DataFrame([('bird', 389.0), ('bird', 24.0), ('mammal', 80.5), ('mammal', np.nan)], index=['falcon', 'parrot', 'lion', 'monkey'], columns=('class', 'max_speed')) df
class max_speed
falcon bird 389.0
parrot bird 24.0
lion mammal 80.5
monkey mammal NaN
重置索引时,会将旧索引添加为列,并使用新的顺序索引:
df.reset_index()
index class max_speed
0 falcon bird 389.0
1 parrot bird 24.0
2 lion mammal 80.5
3 monkey mammal NaN
我们可以使用drop参数来避免将旧索引添加为列:
df.reset_index(drop=True)
class max_speed
0 bird 389.0
1 bird 24.0
2 mammal 80.5
3 mammal NaN
也可以将reset_index与MultiIndex 一起使用。
index = pd.MultiIndex.from_tuples([('bird', 'falcon'), ('bird', 'parrot'), ('mammal', 'lion'), ('mammal', 'monkey')], names=['class', 'name']) columns = pd.MultiIndex.from_tuples([('speed', 'max'), ('species', 'type')]) df = pd.DataFrame([(389.0, 'fly'), ( 24.0, 'fly'), ( 80.5, 'run'), (np.nan, 'jump')], index=index, columns=columns) df
speed species
max type
class name
bird falcon 389.0 fly
parrot 24.0 fly
mammal lion 80.5 run
monkey NaN jump
如果索引具有多个级别,我们可以重置其中的一个子集:
df.reset_index(level='class')
class speed species
max type
name
falcon bird 389.0 fly
parrot bird 24.0 fly
lion mammal 80.5 run
monkey mammal NaN jump
如果我们不删除索引,则默认情况下,它位于顶层。我们可以将其放在另一个级别:
df.reset_index(level='class', col_level=1)
speed species
class max type
name
falcon bird 389.0 fly
parrot bird 24.0 fly
lion mammal 80.5 run
monkey mammal NaN jump
当索引插入到另一个级别下时,我们可以使用参数col_fill指定在哪个级别下:
df.reset_index(level='class', col_level=1, col_fill='species')
species speed species
class max type
name
falcon bird 389.0 fly
parrot bird 24.0 fly
lion mammal 80.5 run
monkey mammal NaN jump
如果我们为col_fill指定一个不存在的级别,则会创建它:
df.reset_index(level='class', col_level=1, col_fill='genus')
genus speed species
class max type
name
falcon bird 389.0 fly
parrot bird 24.0 fly
lion mammal 80.5 run
monkey mammal NaN jump