在数据分析过程中,有时出于增强数据可读性或其他原因,我们需要对数据表的索引值进行设定。

通常,在 Pandas Dataframe 中,我们默认以 0 到对象长度的序列号作为索引。我们也可以将 DataFrame 中的某一列作为其索引。

索引是什么

在进行数据分析时,通常我们要根据业务情况进行数据筛选,要求筛选特定情况的行或列,这时就要根据数据类型(Series或者DataFrame)的索引情况对数据进行相应的行切片或者列索引的处理。

在 Pandas 中最常用的就是数据类型就是 Series 和 DataFrame,它们的索引情况如下:

Series

  • 索引(index):对应是最左侧那一列
  • 值(values):每一个索引的右侧对应一个值

DataFrame 有两种索引

  • 行索引(index):对应最左边的那一列
  • 列索引(columns):对应最上面的那一行

set_index()

Pandas.DataFrame.set_index() 方法用于为 DataFrame 添加索引(行标签)。

语法:

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

返回值: DataFrame or None

如果 inplace 设置为 True 则返回 None 否则返回一个新的 DataFrame。

参数说明:

  • keys:指定要设置为索引的列名或列名的列表。
  • drop:是否舍弃作为索引的列。默认为 True,表示将指定的列从 DataFrame 中删除并设置为索引。如果设置为 False,则保留指定的列作为普通列,同时创建一个新的索引列
  • append:默认为 False,表示替换现有的索引。如果设置为 True,则将新的索引列附加到现有的索引列中,和原索引组成多层索引。
  • inplace:默认为 False,表示返回一个新的 DataFrame,而不修改原始的 DataFrame。如果设置为 True ,则在原始 DataFrame 上进行就地修改,并返回 None
  • verify_integrity:默认为 False,表示不验证新的索引是否唯一。如果设置为 True,则会验证新的索引是否唯一,如果存在重复值,将引发异常

实例说明:

from odps import ODPS
from odps.df import DataFrame
import pandas as pd

users = o.get_table('pyodps_ml_100k_users').to_df().head(10).to_pandas()
print(users)

PyODPS_Pandas_set_index_01

  • 将 user_id 列作为行索引
users1 = users.set_index('user_id')
print(users1)
print(users1.index)
print(users1.loc[1])

PyODPS_Pandas_set_index_02

  • 将 user_id 列和 sex 列作为行索引
users2 = users.set_index(['user_id', 'sex'])
print(users2)
print(users2.index)
print(users2.loc[1].loc['M'])

PyODPS_Pandas_set_index_03

  • 指定参数 drop=True,该参数为默认参数
users3 = users.set_index('user_id', drop=True)
print(users3)

PyODPS_Pandas_set_index_04

  • 指定参数 drop=False
users4 = users.set_index('user_id', drop=False)
print(users4)

PyODPS_Pandas_set_index_05

注:对比参数 drop=True 和 drop=False,可以看到,当 drop=False 时,被作为行索引的那一列数据仍然被保留下来了。

  • 指定参数 append=False,该参数为默认参数
users5 = users.set_index('user_id', append=False)
print(users5)

PyODPS_Pandas_set_index_04

  • 指定参数 append=True
users6 = users.set_index('user_id', append=True)
print(users6)

PyODPS_Pandas_set_index_06

注:对比参数 append=True 和 append=False,可以看到,当 append=True 时,原来行索引和新的行索引一起被保留下来了。

reset_index()

Pandas.DataFrame.reset_index 方法用于将 DataFrame 的索引,重置为数字索引。如果 DataFrame 具有 MultiIndex(多层索引),则此方法可以重置一个或多个级别。

默认状态下,reset_index() 会把原索引插入到 DataFrame 作为普通的数据列。

语法:

DataFrame.reset_index(level=None, * , drop=False, inplace=False, col_level=0, col_fill='', allow_duplicates=_NoDefault.no_default, names=None)

返回值: DataFrame or None

如果 inplace 设置为 True 则返回 None 否则返回一个新的 DataFrame 。

参数说明:

  • level:指定要重置的索引级别。默认为 None 表示重置所有级别的索引
  • drop:是否舍弃原索引。默认为 False,原索引会插入到 DataFrame 里作为普通的数据列。如果 drop=True 则原索引会被舍弃,不会被插入到DataFrame
  • inplace:默认为 False,表示返回一个新的 DataFrame,而不修改原始的 DataFrame。如果设置为 True,则在原始 DataFrame 上进行就地修改,并返回 None。

实例说明:

from odps import ODPS
from odps.df import DataFrame
import pandas as pd

users = o.get_table('pyodps_ml_100k_users').to_df().head(10).to_pandas()
print(users)

PyODPS_Pandas_set_index_01

reset_index() 函数可分为两种类型,第一种是对原来的数据表进行 reset;第二种是对使用过 set_index() 函数的数据表进行 reset。

对原来的数据表进行 reset

  • 指定参数 drop=False,该参数为默认参数
users2 = users.reset_index(drop=False)
print(users2)

PyODPS_Pandas_set_index_07

原来索引值被还原成了普通列,同时被系统命名为 index 字段。

  • 指定参数 drop=True
users3 = users.reset_index(drop=True)
print(users3)

PyODPS_Pandas_set_index_08

对使用过 set_index() 函数的数据表进行 reset

  • 使用 set_index() 函数进行索引设置
users4 = users.set_index('user_id')
print(users4)

PyODPS_Pandas_set_index_09

  • 使用 reset_index() 函数进行还原
users5 = users4.reset_index(drop=False)
print(users5)

PyODPS_Pandas_set_index_10

users6 = users4.reset_index(drop=True)
print(users6)

PyODPS_Pandas_set_index_11

参考资料

Pandas.DataFrame.reset_index() 重置索引详解

Pandas.DataFrame.set_index() 添加索引详解

Python 数据分析基础 > Pandas 中 set_index()、reset_index() 的使用

原创文章,转载请注明出处:http://www.opcoder.cn/article/68/