【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织

前言

在数据科学和数据分析领域,Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具,帮助我们高效地处理和分析数据。其中,索引在Pandas中扮演着关键角色,它是一种强大的数据组织和访问机制,使我们能够更好地理解和操作数据。

本博客将探讨Pandas中与索引相关的核心知识点和常用操作。我们将了解如何设置和重置索引,通过索引来选择和过滤数据,以及如何利用多级索引来处理复杂的层次结构数据。


索引

当涉及Python或Pandas库中的索引时,通常指的是Pandas库中的DataFrame和Series对象的索引。这里只简单介绍一下索引,索引的具体用法均在其他操作中

案例数据表university_rank.csv

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织_第1张图片

索引的设置

我们可以在读入数据的时候就通过pd.read_csv相关属性来设置索引列,可以是单列也可以是多列,需要用列表来表达

读取时设置索引

pd.read_csv(
    # 设置索引列
    index_col = []
    .....
    ....
)

In[0]:

df = pd.read_csv("university_rank.csv", index_col=["大学名称"])
df

out[0]:

排名 地区 学科领域 排名依据
大学名称
哈佛大学 1 北美 工程 学术声誉
牛津大学 2 欧洲 医学 科研产出
北京大学 3 亚洲 商学 国际影响力
悉尼大学 4 大洋洲 计算机科学 教学质量
圣保罗大学 5 南美 艺术 学生满意度
... ... ... ... ...
圣保罗国立大学 96 南美 计算机科学 研究生录取率
约翰内斯堡大学 97 非洲 环境科学 学术声誉
麦吉尔大学 98 北美 艺术 学生满意度
伦敦政治经济学院 99 欧洲 法律 国际影响力
东京大学 100 亚洲 教育 毕业生就业率

100 rows × 4 columns

如果我想要设置多个变量列作为索引呢?

In[1]:

df = pd.read_csv("university_rank.csv", index_col=["地区", "学科领域"]) # 设置多个变量列作为索引
df

out[1]:

大学名称 排名 排名依据
地区 学科领域
北美 工程 哈佛大学 1 学术声誉
欧洲 医学 牛津大学 2 科研产出
亚洲 商学 北京大学 3 国际影响力
大洋洲 计算机科学 悉尼大学 4 教学质量
南美 艺术 圣保罗大学 5 学生满意度
... ... ... ...
计算机科学 圣保罗国立大学 96 研究生录取率
非洲 环境科学 约翰内斯堡大学 97 学术声誉
北美 艺术 麦吉尔大学 98 学生满意度
欧洲 法律 伦敦政治经济学院 99 国际影响力
亚洲 教育 东京大学 100 毕业生就业率

100 rows × 3 columns

DataFrame.set_index方法设置索引

除此之外也可以使用DataFrame类型数据自带的df.set_index方法

df.set_index(
    # 索引列名,需要使用list类型
    key
    # 建立索引后是否删除该列
    drop = True
    # 是否在原索引上添加索引
    append = False
    # 是否直接修改原df
    inplace = False
    # 默认为False,如果为True,则检查新的索引是否唯一,如果有重复则会抛出ValueError
    verify_integrity = False
)

In[2]:

df = pd.read_csv("university_rank.csv")
df.set_index(keys=["排名"], append=True, inplace=True)
print(type(df)) # 查看df类型
df

out[2]:


大学名称 地区 学科领域 排名依据
排名
0 1 哈佛大学 北美 工程 学术声誉
1 2 牛津大学 欧洲 医学 科研产出
2 3 北京大学 亚洲 商学 国际影响力
3 4 悉尼大学 大洋洲 计算机科学 教学质量
4 5 圣保罗大学 南美 艺术 学生满意度
... ... ... ... ... ...
95 96 圣保罗国立大学 南美 计算机科学 研究生录取率
96 97 约翰内斯堡大学 非洲 环境科学 学术声誉
97 98 麦吉尔大学 北美 艺术 学生满意度
98 99 伦敦政治经济学院 欧洲 法律 国际影响力
99 100 东京大学 亚洲 教育 毕业生就业率

100 rows × 4 columns

上面这个例子就很明显的看出来append参数的作用,本来该DataFrame就有一个流水索引,后面又添加了一个排名索引并且append参数为True
但是我们发现打印出来是100 row * 4 columns所以排名变成索引后就不在作为一个列来存在了,我们可以使用drop参数来改变它

In[3]:

df = pd.read_csv("university_rank.csv")
df.set_index(keys=["排名"], append=True, inplace=True, drop=False) # 调整drop参数
df

out[3]:

大学名称 排名 地区 学科领域 排名依据
排名
0 1 哈佛大学 1 北美 工程 学术声誉
1 2 牛津大学 2 欧洲 医学 科研产出
2 3 北京大学 3 亚洲 商学 国际影响力
3 4 悉尼大学 4 大洋洲 计算机科学 教学质量
4 5 圣保罗大学 5 南美 艺术 学生满意度
... ... ... ... ... ... ...
95 96 圣保罗国立大学 96 南美 计算机科学 研究生录取率
96 97 约翰内斯堡大学 97 非洲 环境科学 学术声誉
97 98 麦吉尔大学 98 北美 艺术 学生满意度
98 99 伦敦政治经济学院 99 欧洲 法律 国际影响力
99 100 东京大学 100 亚洲 教育 毕业生就业率

100 rows × 5 columns

取消set_index索引设置

那么我们该如何还原呢,答案就是使用df.reset_index

df.reset_index()是Pandas DataFrame对象的一个方法,它用于重置(恢复)DataFrame的索引,将整数序列作为新的行索引,并将原来的行索引(可能是整数、字符串或其他类型)转换为DataFrame的列。

df.reset_index(
    # 是否将索引列删除,而不还原
    drop = Flase
    # 是否修改原df
    inplace = False
    #  可选参数,用于指定要重置的索引级别。如果不指定,则会重置所有的索引级别
    level
    # 如果DataFrame具有多级列索引,该参数用于指定要重置的列级别。默认为0,即第一级
	col_level
	# 如果指定了col_level,则可以使用该参数为重置的列索引命名
	col_fill
)

In[4]:

df.reset_index(drop=True, inplace=True)
df
大学名称 排名 地区 学科领域 排名依据
0 哈佛大学 1 北美 工程 学术声誉
1 牛津大学 2 欧洲 医学 科研产出
2 北京大学 3 亚洲 商学 国际影响力
3 悉尼大学 4 大洋洲 计算机科学 教学质量
4 圣保罗大学 5 南美 艺术 学生满意度
... ... ... ... ... ...
95 圣保罗国立大学 96 南美 计算机科学 研究生录取率
96 约翰内斯堡大学 97 非洲 环境科学 学术声誉
97 麦吉尔大学 98 北美 艺术 学生满意度
98 伦敦政治经济学院 99 欧洲 法律 国际影响力
99 东京大学 100 亚洲 教育 毕业生就业率

100 rows × 5 columns

DataFrame.index.name修改索引名称

此外我们也可以使用df.index.names来修改索引的名称

In[5]:

df.index.names = ["ID"] # df是案例数据表,设置索引名称为ID
df

out[5]:

大学名称 排名 地区 学科领域 排名依据
ID
0 哈佛大学 1 北美 工程 学术声誉
1 牛津大学 2 欧洲 医学 科研产出
2 北京大学 3 亚洲 商学 国际影响力
3 悉尼大学 4 大洋洲 计算机科学 教学质量
4 圣保罗大学 5 南美 艺术 学生满意度
... ... ... ... ... ...
95 圣保罗国立大学 96 南美 计算机科学 研究生录取率
96 约翰内斯堡大学 97 非洲 环境科学 学术声誉
97 麦吉尔大学 98 北美 艺术 学生满意度
98 伦敦政治经济学院 99 欧洲 法律 国际影响力
99 东京大学 100 亚洲 教育 毕业生就业率

100 rows × 5 columns


索引的排序

建立完索引后我们可以根据索引来进行排序,具体使用的方法是df.sort_index()

DataFrame.sort_index索引排序

df.sort_index()是Pandas DataFrame对象的一个方法,用于按照索引(行标签)对DataFrame进行排序。它可以根据行索引的标签值进行升序或降序排序。

df.sort_index(
    # 多重索引时的优先级
    level
    # 是否为升序
    ascending = True
    # 是否在原df修改
    inplace = False
    # 缺失值的排列顺序,可选值有 'first' 和 'last',默认为 'last',表示NaN在排序后放在最后。
    na_position = 'last'
    # 是否按索引排序后丢弃索引,默认为False,如果为True,则在排序后重置行索引为从0开始的连续整数索引
    ignore_index = False
    # 默认为0,表示按照行索引排序。如果设置为1,则按列索引排序(对于多级索引的DataFrame)
    axis = 0
	# 排序算法的种类。可选值有 'quicksort'、'mergesort'、'heapsort',默认为 'quicksort'
	kind = 'quicksort'
	# 默认为True,如果在排序时有未指定的级别或索引,则对其进行排序。如果设置为False,则保持原样
	sort_remaining = True
    # 1.1.0新增属性,可以对索引值进行函数修改
    key
)

In[6]:

df = pd.read_csv("university_rank.csv", index_col=["学科领域", "地区"])
df

out[6]:

大学名称 排名 排名依据
学科领域 地区
工程 北美 哈佛大学 1 学术声誉
医学 欧洲 牛津大学 2 科研产出
商学 亚洲 北京大学 3 国际影响力
计算机科学 大洋洲 悉尼大学 4 教学质量
艺术 南美 圣保罗大学 5 学生满意度
... ... ... ... ...
计算机科学 南美 圣保罗国立大学 96 研究生录取率
环境科学 非洲 约翰内斯堡大学 97 学术声誉
艺术 北美 麦吉尔大学 98 学生满意度
法律 欧洲 伦敦政治经济学院 99 国际影响力
教育 亚洲 东京大学 100 毕业生就业率

100 rows × 3 columns

In[7]:

df.sort_index()

out[7]:

大学名称 排名 排名依据
学科领域 地区
医学 亚洲 清华大学 34 学术声誉
亚洲 清华大学 54 教学质量
亚洲 清华大学 74 教学质量
亚洲 清华大学 94 教学质量
北美 麦吉尔大学 28 教学质量
... ... ... ... ...
计算机科学 南美 里约热内卢大学 86 研究生录取率
南美 圣保罗国立大学 96 研究生录取率
大洋洲 悉尼大学 4 教学质量
大洋洲 墨尔本大学 14 学术声誉
大洋洲 奥克兰大学 24 教学质量

100 rows × 3 columns

In[8]:

df.sort_index(level="地区")

out[8]:

大学名称 排名 排名依据
学科领域 地区
医学 亚洲 清华大学 34 学术声誉
亚洲 清华大学 54 教学质量
亚洲 清华大学 74 教学质量
亚洲 清华大学 94 教学质量
商学 亚洲 北京大学 3 国际影响力
... ... ... ... ...
环境科学 非洲 约翰内斯堡大学 57 学术声誉
非洲 约翰内斯堡大学 67 学术声誉
非洲 约翰内斯堡大学 77 学术声誉
非洲 约翰内斯堡大学 87 学术声誉
非洲 约翰内斯堡大学 97 学术声誉

100 rows × 3 columns

In[9]:

df.sort_index(level="地区", ignore_index=True)

out[9]:

大学名称 排名 排名依据
0 清华大学 34 学术声誉
1 清华大学 54 教学质量
2 清华大学 74 教学质量
3 清华大学 94 教学质量
4 北京大学 3 国际影响力
... ... ... ...
95 约翰内斯堡大学 57 学术声誉
96 约翰内斯堡大学 67 学术声誉
97 约翰内斯堡大学 77 学术声誉
98 约翰内斯堡大学 87 学术声誉
99 约翰内斯堡大学 97 学术声誉

100 rows × 3 columns

DataFrame.sort_values变量列排序

如果我想要按照变量来排序呢,而不是索引?df.sort_values可以帮到你

df.sort_values(
    # 用于指定排序的列名或列名列表。可以传入单个列名的字符串,也可以传入一个包含多个列名的列表,表示按照这些列的值进行排序
    by
    # 默认为0,表示按照行进行排序。如果设置为1,则按列进行排序
    axis = 0
    # 默认为True,表示升序排序。如果设置为False,表示降序排序
    ascending = True
    # 默认为False,是否在原df上修改
    inplace = False
    # 指定缺失值(NaN)在排序后的位置。可选值有 'first' 和 'last',默认为 'last',表示NaN在排序后放在最后
    na_position = 'last'
    # 默认为False,如果为True,则在排序后重置行索引为从0开始的连续整数索引
    ignore_index = False
)

In[10]:

data = {
    'ID': [4, 2, 1, 3],
    'Name': ['David', 'Bob', 'Alice', 'Charlie'],
    'Age': [40, 30, 25, 35]
}

df = pd.DataFrame(data)
print(df)

out[10]:

   ID     Name  Age
2   1    Alice   25
1   2      Bob   30
3   3  Charlie   35
0   4    David   40

现在,我们按照’Age’列进行升序排序

In[11]:

df_sorted = df.sort_values(by='Age')
print(df_sorted)

out[11]:

   ID     Name  Age
2   1    Alice   25
1   2      Bob   30
3   3  Charlie   35
0   4    David   40

结束语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

你可能感兴趣的:(Python,数据挖掘,python,数据分析)