pandas中reset_index和set_index用法

在处理数据的时候,经常需要将抓取到的数据和运营提供的数据进行一个匹配更新,大多数情况下都是以商品的链接作为index进行匹配,所以在读数据的时候我都会使用index_col来指定。这样的话,能解决抓取数据和原始数据的匹配问题,但是呢,抓取数据就少了urls这一项(已作为index),最后更新完数据还是需要将商品链接给补上。使用reset_index()函数就可以轻松解决这个问题。

reset_index()

该函数能够将行索引转为列。

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

drop为False则索引会被还原为普通列,否则会丢失。

对于单索引问题,使用level=0level=‘index_name’的作用是一样的,也可以不提供level参数。

1
dataframe.reset_index(level=0)

对于多级索引,情况稍微有点不同。

1
2
3
4
5
6
import pandas as pd
import numpy as np

index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], ['North', 'South']],
names=['State', 'Direction'])
df = pd.DataFrame(index=index, data=np.random.randint(0, 10, (6,4)), columns=list('abcd'))

直接调用reset_index(),默认是将全部级别的行索引都转为列数据,并使用一个RangeInddex来作为新索引。

1
df.reset_index()

使用level参数可以选择指定的行索引。

1
2
3
df.reset_index(level=1) 
# or
df.reset_index(level=‘Direction’)

需要转换多个行索引时使用列表。

1
df.reset_index(level=[‘State’,’Direction’])

另外,我们将数据关于某个字段进行分组之后,groupby的键将会作为结果的index,如果不想要这样,可以在分组时设置as_index=False,就可以将groupby的键仍然作为列数据。

1
2
3
df2 = df.reset_index()
# 这里的first()是取每个分组的第一条记录
df2.groupby('Direction', as_index=False).first()

set_index()

set_index()则与之相反 ,该函数用来设置行索引。

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

参数说明:

  • 设置索引的参数是keys
  • append添加新索引
  • drop为False时,成功设置了index,同时列数据中仍然保存着index字段
  • inplace为True时,修改了原始数据

单索引直接传入字符串即可。

1
df2.set_index('State')

复合索引则输入列表。

1
df2.set_index(keys=['State', 'Direction'])

可以很自由的设置复合索引的level,不过在这个例子没有体现出来

1
df2.set_index(keys=['Direction', 'State'])

参考链接:

How to convert pandas index in a dataframe to a column?