Pandas中多重索引技巧的实现!
Pandas中多重索引技巧的实现!
大家好,在数据分析中,处理复杂的多维数据是常见的需求。Python的Pandas库提供了强大的多重索引(MultiIndex)功能,能够灵活地管理和分析多层级的数据结构。本文将介绍Pandas中的多重索引,探讨如何创建、操作和重设多重索引,并通过具体的示例代码展示其在实际应用中的强大功能。
1.多重索引概述
多重索引是一种层次化的索引方式,它允许在DataFrame或Series中使用多个级别的索引。通过多重索引,我们可以更清晰地表达数据的层级关系,使得处理复杂数据集变得更加直观和高效。
可以通过多列数据创建多重索引,从而将DataFrame组织成具有层次结构的形式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import pandas as pd # 创建一个包含多个级别的DataFrame data = { '城市' : [ '北京' , '北京' , '上海' , '上海' , '广州' , '广州' ], '年份' : [ 2020 , 2021 , 2020 , 2021 , 2020 , 2021 ], '人口' : [ 2154 , 2160 , 2424 , 2430 , 1530 , 1540 ], 'GDP' : [ 36102 , 37200 , 38155 , 39400 , 25000 , 26000 ]} df = pd.DataFrame(data) # 设置多重索引 df.set_index([ '城市' , '年份' ], inplace = True ) print (df) |
运行以上代码,输出结果:
人口 GDP
城市 年份
北京 2020 2154 36102
2021 2160 37200
上海 2020 2424 38155
2021 2430 39400
广州 2020 1530 25000
2021 1540 26000
在这个示例中,通过 set_index()
函数将 城市
和 年份
两列设置为多重索引,生成了一个具有层次结构的DataFrame。
2.多重索引的基本操作
一旦我们创建了多重索引,Pandas提供了多种方法来操作和查询这些数据,包括选择、切片、交换层级、重设索引等。
2.1 选择和切片多重索引
多重索引使得我们可以轻松地选择或切片数据。例如,可以选择某个城市的数据,或者选择特定年份的数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import pandas as pd # 创建一个包含多个级别的DataFrame data = { '城市' : [ '北京' , '北京' , '上海' , '上海' , '广州' , '广州' ], '年份' : [ 2020 , 2021 , 2020 , 2021 , 2020 , 2021 ], '人口' : [ 2154 , 2160 , 2424 , 2430 , 1530 , 1540 ], 'GDP' : [ 36102 , 37200 , 38155 , 39400 , 25000 , 26000 ]} df = pd.DataFrame(data) df.set_index([ '城市' , '年份' ], inplace = True ) # 选择特定城市的数据 beijing_data = df.loc[ '北京' ] print ( "北京的数据:\n" , beijing_data) # 选择特定年份的数据 data_2021 = df.xs( 2021 , level = '年份' ) print ( "2021年的数据:\n" , data_2021) |
运行以上代码,输出结果:
北京的数据:
人口 GDP
年份
2020 2154 36102
2021 2160 372002021年的数据:
人口 GDP
城市
北京 2160 37200
上海 2430 39400
广州 1540 26000
在这个示例中,使用 loc[]
选择了北京的数据,并使用 xs()
方法按年份选择了2021年的数据。
2.2 交换层级与重设索引
多重索引可以交换不同级别的索引位置,并可以将多重索引重设为普通索引。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import pandas as pd # 创建一个包含多个级别的DataFrame data = { '城市' : [ '北京' , '北京' , '上海' , '上海' , '广州' , '广州' ], '年份' : [ 2020 , 2021 , 2020 , 2021 , 2020 , 2021 ], '人口' : [ 2154 , 2160 , 2424 , 2430 , 1530 , 1540 ], 'GDP' : [ 36102 , 37200 , 38155 , 39400 , 25000 , 26000 ]} df = pd.DataFrame(data) df.set_index([ '城市' , '年份' ], inplace = True ) # 交换索引的层级 swapped_df = df.swaplevel() print ( "交换层级后的DataFrame:\n" , swapped_df) # 重设索引 reset_df = df.reset_index() print ( "重设索引后的DataFrame:\n" , reset_df) |
运行以上代码,输出结果:
交换层级后的DataFrame:
人口 GDP
年份 城市
2020 北京 2154 36102
2021 北京 2160 37200
2020 上海 2424 38155
2021 上海 2430 39400
2020 广州 1530 25000
2021 广州 1540 26000重设索引后的DataFrame:
城市 年份 人口 GDP
0 北京 2020 2154 36102
1 北京 2021 2160 37200
2 上海 2020 2424 38155
3 上海 2021 2430 39400
4 广州 2020 1530 25000
5 广州 2021 1540 26000
在这个示例中,使用 swaplevel()
交换了 城市
和 年份
索引的层级,使用 reset_index()
将多重索引还原为普通索引。
3.多重索引的高级操作
除了基本的选择和操作外,Pandas的多重索引还支持更高级的操作,如分组聚合、多索引切片、索引排序等,这些功能可以更灵活地处理复杂的数据集。
3.1 多重索引的分组聚合
可以在多重索引的基础上进行分组操作,并应用聚合函数,如计算总和、平均值等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import pandas as pd # 创建一个包含多个级别的DataFrame data = { '城市' : [ '北京' , '北京' , '上海' , '上海' , '广州' , '广州' ], '年份' : [ 2020 , 2021 , 2020 , 2021 , 2020 , 2021 ], '人口' : [ 2154 , 2160 , 2424 , 2430 , 1530 , 1540 ], 'GDP' : [ 36102 , 37200 , 38155 , 39400 , 25000 , 26000 ]} df = pd.DataFrame(data) df.set_index([ '城市' , '年份' ], inplace = True ) # 按城市分组,计算GDP的总和 grouped_gdp = df.groupby( '城市' )[ 'GDP' ]. sum () print ( "按城市分组的GDP总和:\n" , grouped_gdp) |
运行以上代码,输出结果:
按城市分组的GDP总和:
城市
北京 73302
上海 77555
广州 51000
Name: GDP, dtype: int64
在这个示例中,对多重索引进行了按城市分组,并计算了每个城市在不同年份的GDP总和。
3.2 多索引切片操作
Pandas可以使用 slice
对多重索引进行切片操作,这在处理多维数据时非常有用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import pandas as pd import numpy as np # 创建一个包含多个级别的DataFrame arrays = [ [ '北京' , '北京' , '北京' , '上海' , '上海' , '广州' , '广州' ], [ 2020 , 2021 , 2022 , 2020 , 2021 , 2020 , 2021 ] ] index = pd.MultiIndex.from_arrays(arrays, names = ( '城市' , '年份' )) data = np.random.randn( 7 , 2 ) df = pd.DataFrame(data, index = index, columns = [ '指标1' , '指标2' ]) # 对多重索引进行切片 sliced_df = df.loc[pd.IndexSlice[:, 2021 ], :] print ( "切片后的DataFrame:\n" , sliced_df) |
运行以上代码,输出结果:
切片后的DataFrame:
指标1 指标2
城市 年份
北京 2021 0.558769 0.722681
上海 2021 0.392982 0.888569
广州 2021 -0.668413 -0.907221
在这个示例中,使用 pd.IndexSlice
对多重索引进行了切片操作,选取了所有城市在2021年的数据。这种切片操作可以非常方便地从多层级数据中提取出感兴趣的部分。
3.3 多重索引的排序
多重索引还可以进行排序操作,这在需要按特定顺序查看数据时非常有用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import pandas as pd import numpy as np # 创建一个包含多个级别的DataFrame arrays = [ [ '北京' , '北京' , '上海' , '上海' , '广州' , '广州' ], [ 2021 , 2020 , 2021 , 2020 , 2021 , 2020 ] ] index = pd.MultiIndex.from_arrays(arrays, names = ( '城市' , '年份' )) data = np.random.randn( 6 , 2 ) df = pd.DataFrame(data, index = index, columns = [ '指标1' , '指标2' ]) # 对多重索引进行排序 sorted_df = df.sort_index(level = [ '城市' , '年份' ], ascending = [ True , False ]) print ( "排序后的DataFrame:\n" , sorted_df) |
运行以上代码,输出结果:
排序后的DataFrame:
指标1 指标2
城市 年份
北京 2021 1.013978 0.731106
2020 -0.856558 0.696849
上海 2021 -0.585347 0.494768
2020 0.129116 -0.477598
广州 2021 -0.542223 1.212357
2020 0.221365 -0.055147
在这个示例中,对多重索引进行了排序,按城市名称升序排列,同时按年份降序排列。这种排序操作可以以一种更符合分析需求的顺序来查看数据。
4.多重索引的实际应用场景
多重索引在许多实际应用中非常有用,特别是在处理时间序列数据、面板数据和多维数据集时。
在时间序列分析中,经常需要将日期和其他类别变量(如产品、地区)结合使用进行分析。多重索引可以管理和分析这些数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import pandas as pd import numpy as np # 创建时间序列数据 dates = pd.date_range( '2023-01-01' , periods = 6 ) products = [ '产品A' , '产品B' ] index = pd.MultiIndex.from_product([dates, products], names = [ '日期' , '产品' ]) data = np.random.randn( 12 , 2 ) df = pd.DataFrame(data, index = index, columns = [ '销售额' , '利润' ]) print ( "时间序列数据的DataFrame:\n" , df) # 按产品分组计算总销售额 total_sales = df.groupby( '产品' )[ '销售额' ]. sum () print ( "\n按产品分组的总销售额:\n" , total_sales) |
运行以上代码,输出结果:
时间序列数据的DataFrame:
销售额 利润
日期 产品
2023-01-01 产品A -0.856051 0.166173
产品B 0.934522 0.570209
2023-01-02 产品A -0.205493 1.195617
产品B -1.286157 0.122996
2023-01-03 产品A -1.618019 0.593061
产品B 0.246715 -0.654644
2023-01-04 产品A 0.158859 -1.404354
产品B -0.255284 1.383135
2023-01-05 产品A 0.408226 0.799745
产品B 0.411282 0.339705
2023-01-06 产品A -1.023615 -0.616391
产品B -1.564080 1.062635按产品分组的总销售额:
产品
产品A -3.136093
产品B -1.513002
Name: 销售额, dtype: float64
在这个示例中,使用多重索引将日期和产品组合在一起,并通过分组计算每种产品的总销售额。
在数据分析中,Python Pandas的多重索引功能提供了强大的工具来处理复杂的多维数据。通过多重索引,用户可以将数据框分层管理,使得数据的选择、切片、分组和聚合操作更加直观和高效。多重索引不仅可以在处理时间序列、面板数据和其他多层次数据时更加灵活,还能提升数据分析的精度和效率。掌握Pandas的多重索引操作,能够在面对复杂数据结构时更加从容自如。
到此这篇关于Pandas中多重索引技巧的实现的文章就介绍到这了。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。
共有 0 条评论