Pandas中如何将分组值设置为DataFrame索引并实现层级展示

pandas中如何将分组值设置为dataframe索引并实现层级展示

本教程详细阐述了在Pandas中如何通过`set_index`方法结合`sort_index`来创建具有层级结构的DataFrame索引,从而实现数据按指定列(如’Continent’)分组的视觉效果。文章澄清了`set_index`与`groupby`的区别,并提供了具体代码示例,指导读者高效地组织和访问多层索引数据。

理解Pandas中的索引与分组操作

在Pandas数据处理中,groupby()和set_index()是两个核心但功能截然不同的操作。初学者常会将它们混淆,尤其是在希望将某一列作为索引并实现数据“分组”展示时。

groupby()方法:其主要目的是对DataFrame进行分组,以便执行聚合操作(如求和、平均值、计数等)或进行迭代。调用groupby()本身并不会立即返回一个已分组的DataFrame,而是返回一个DataFrameGroupBy对象。这个对象需要进一步配合聚合函数(如.sum(), .mean(), .apply()等)才能生成结果。

示例:groupby的典型用法

import pandas as pd# 示例数据data = {    'Country': ['China', 'United States', 'Japan', 'United Kingdom', 'Russian Federation', 'India', 'South Korea', 'Iran', 'Australia', 'Germany', 'France'],    'Continent': ['Asia', 'North America', 'Asia', 'Europe', 'Europe', 'Asia', 'Asia', 'Asia', 'Australia', 'Europe', 'Europe'],    'Population': [1367.64, 317.61, 127.40, 63.87, 143.50, 1276.73, 49.80, 77.07, 23.31, 80.36, 63.83]}df = pd.DataFrame(data)print("原始DataFrame头部:")print(df.head())# 尝试直接groupbygrouped_obj = df.groupby('Continent')print("n直接调用groupby返回的是一个GroupBy对象:")print(grouped_obj)# groupby的聚合用法continent_population_sum = df.groupby('Continent')['Population'].sum()print("n按大洲汇总人口:")print(continent_population_sum)# groupby的迭代用法print("n按大洲迭代:")for continent, group_df in df.groupby('Continent'):    print(f"--- {continent} ---")    print(group_df)

set_index()方法:此方法用于将DataFrame中的一列或多列设置为新的索引。当设置多列作为索引时,它会创建一个多级索引(MultiIndex),这正是实现数据层级展示的关键。

创建层级索引实现数据分组展示

要实现将某一列(如’Continent’)作为主索引,并在其下展示相关数据,同时让主索引值只显示一次,最有效的方法是使用set_index()创建多级索引,并结合sort_index()。Pandas在显示多级索引时,会自动折叠相同的高层级索引值,使其只显示一次,从而营造出“分组”的视觉效果。

Lifetoon Lifetoon

免费的AI漫画创作平台

Lifetoon 92 查看详情 Lifetoon

步骤:

确定索引列:选择你希望作为层级索引的列。通常,层级越高的列放在前面。使用set_index():将选定的列列表传递给set_index()方法。使用sort_index():为了确保相同的高层级索引值能够被Pandas正确折叠显示,通常需要对索引进行排序。

示例:将’Continent’和’Country’设置为多级索引

假设我们有以下DataFrame,它可能已经经过了一些计算,包含Country和Population以及聚合统计量:

import pandas as pdimport numpy as np# 模拟用户"Edit"后的DataFrame结构data_edit = {    'Country': ['China', 'Japan', 'India', 'South Korea', 'Iran', 'Australia', 'United Kingdom', 'Russian Federation', 'Germany', 'France'],    'Population': [1367.645, 127.409, 1276.730, 49.805, 77.075, 23.316, 63.870, 143.500, 80.369, 63.837],    'Continent': ['Asia', 'Asia', 'Asia', 'Asia', 'Asia', 'Australia', 'Europe', 'Europe', 'Europe', 'Europe'],    'sum': [2898.666, 2898.666, 2898.666, 2898.666, 2898.666, 23.316, 457.929, 457.929, 457.929, 457.929],    'size': [5, 5, 5, 5, 5, 1, 6, 6, 6, 6],    'mean': [579.733, 579.733, 579.733, 579.733, 579.733, 23.316, 76.321, 76.321, 76.321, 76.321],    'std': [679.097, 679.097, 679.097, 679.097, 679.097, np.nan, 34.647, 34.647, 34.647, 34.647]}cont_df = pd.DataFrame(data_edit)print("原始DataFrame (可能经过计算) 头部:")print(cont_df.head(10))# 将'Continent'和'Country'设置为多级索引# 注意:set_index会移除原列,如果需要保留原列,可以先复制一份或使用reset_indexcont_indexed = cont_df.set_index(['Continent', 'Country']).sort_index()print("n设置多级索引并排序后的DataFrame:")print(cont_indexed)

输出示例(部分):

设置多级索引并排序后的DataFrame:                        Population      sum  size     mean      stdContinent     Country                                              Asia          China     1367.645  2898.666     5  579.733  679.097              India     1276.730  2898.666     5  579.733  679.097              Iran        77.075  2898.666     5  579.733  679.097              Japan      127.409  2898.666     5  579.733  679.097              South Korea 49.805  2898.666     5  579.733  679.097Australia     Australia   23.316    23.316     1   23.316      NaNEurope        France      63.837   457.929     6   7

以上就是Pandas中如何将分组值设置为DataFrame索引并实现层级展示的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/904880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
iOS 17中使用一键裁剪功能的步骤
上一篇 2025年11月28日 22:23:59
两样情!海外吹裁员风 国内AI职缺7个月翻倍成长
下一篇 2025年11月28日 22:24:02

相关推荐

发表回复

登录后才能评论
关注微信