Python 数据分析(已有升级版新文章):分组统计并排序。用到:df.groupby()和df.sort_values()

部署运行你感兴趣的模型镜像

  很多教程把df.groupby()写得非常复杂,咱们以一个实例,用一个比较简单的需求讲讲这东西到底怎么用。
@TOP

需求

  假设拿到如下图所示Excel表,想统计“计算机”类图书一共卖了多少本。
图书销售表
  如果直接在表中操作,怎么做?
  第一步,选中B列,排序,升序或降序都无所谓,总之让相同的分类凑一起;
升序排序后图书销售表
  第二步,这里数据量少,直接拖选一下计算机这4行看状态栏就知道总共136。量多的时候可以用Excel的“分类汇总”功能,同样得到136:
分类汇总
  一共就两步,完成任务。当然这个销量还可以再排序,没这个需求,不排也可以。
  如果用Python+pandas来做,如何?

编程实现

  直接上代码吧,边写边解说。

import pandas as pd
xls = "book.xls"
df = pd.DataFrame(pd.read_excel(xls))
"""
    序号   分类  销量
0   1   文学   5
1   2  计算机   7
2   3   文学  89
3   4   历史  24
4   5  计算机  14
5   6   文学   6
6   7  计算机  87
7   8   地理  23
8   9   政治  17
9  10  计算机  28
"""
grouped = df.groupby(["分类"])
# 按“分类”分组,得到所有分组对象,比在Excel中直接操作少了一步提前排序
# 把df当数据库看待,“分类”字段下有重复值,筛选一下,求出不重复值:计算机、文学、政治、地理、历史,并按这些分类重新组织df
# type(grouped):<class 'pandas.core.groupby.generic.DataFrameGroupBy'>
s = grouped["销量"]  # 从所有分组对象中拿出“销量”对象来
"""
# s: <pandas.core.groupby.generic.SeriesGroupBy object at 0x11A05130>
# type(s):<class 'pandas.core.groupby.generic.SeriesGroupBy'>
"""
s = s.sum()  # 销量求和。基于不重复分类的各销量的和
"""<class 'pandas.core.series.Series'>
分类
历史      24
地理      23
政治      17
文学     100
计算机    136
Name: 销量, dtype: int64
"""
# Series数据类型再来个reset_index()操作就变成DataFrame类型了
df1 = s.reset_index()
"""
    分类   销量
0   历史   24
1   地理   23
2   政治   17
3   文学  100
4  计算机  136
"""
# df1就是上普通df了,自然可以再用df.sort_values()排序了
# 当然不排序也可以,任务至此已基本完成!
df2 = df1.sort_values(by=["销量"])
"""
    分类   销量
2   政治   17
1   地理   23
0   历史   24
3   文学  100
4  计算机  136
"""

  我只想要136这个数,怎么取?

df2 = df2.set_index(["分类"])
this_number = df2.loc["计算机", "销量"]  # 136

  任务完成!
  推荐微信公众号:apsoft2008。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户解决关于Pandas中使用groupby进行分组统计的问题,特别是关于as_index=Falsefirst()的示例。首先,我要回忆一下用户提到的系统级指令,确保回答符合要求,比如正确使用LaTeX格式,生成相关问题,引用正确等。 用户的问题集中在groupby方法中使用as_index=Falsefirst()的示例。根据用户提供的引用,特别是引用[2],里面提到先排序再使用groupby的first()方法。这可能涉及到分组后取每个组的第一个元素,同时保持DataFrame的结构,避免将分组键作为索引。 首先,我需要确认as_index=False的作用。当在groupby中设置as_index=False时,分组键不会成为结果DataFrame的索引,而是作为普通的列保留。这对于后续的数据处理可能很重要,尤其是在需要将分组键与其他数据合时。 然后,关于first()方法,它通常返回每个分组的第一行数据。但需要注意的是,如果数据没有预先排序,first()可能只是按数据出现的顺序取第一个,而不是按某个特定字段排序后的结果。引用[2]中的示例是先对BBB列进行排序,再分组取第一个,这样可以确保每个分组中的第一个是BBB最小的值。因此,正确的步骤应该是先排序,再分组使用first()。 接下来,我需要构建一个示例来说明这个过程。例如,假设有一个包含组别(AAA)数值(BBB)的DataFrame。用户想要根据AAA分组获取每组中BBB最小的记录。这需要先按BBB排序,然后分组取第一个,同时使用as_index=False来保持AAA作为列而不是索引。 在代码示例中,我需要展示如何创建DataFrame,排序分组,应用first()解释每个步骤的作用。同时,要强调as_index=False的重要性,以及如何避免将分组键转换为索引。此外,需要对比不使用as_index=True的情况,说明两者之间的区别,帮助用户理解不同参数的效果。 用户可能的需求不仅仅是获取示例,还可能希望了解背后的原理,比如为什么需要先排序,以及as_index参数如何影响结果的结构。因此,在解释中需要详细说明这些点,确保用户能够举一反三,应用到其他类似场景。 另外,根据用户提供的引用[3],groupby后对总价求平均值,展示了结果的输出类型。这可能与用户当前的问题相关,但当前问题更侧重于取第一个记录而非聚合计算。需要明确区分这两种操作,确保用户不会混淆。 最后,生成相关问题需要考虑用户可能进一步的问题,比如如何获取最后一个记录,如何处理多个分组键,或者如何结合其他聚合函数。这些问题可以帮助用户深入理解groupby的更多用法,扩展他们的知识。 总结来说,我需要分步骤构建一个清晰的示例,详细解释每个参数步骤的作用,确保用户能够理解正确应用groupby的as_index=Falsefirst()方法,同时生成相关问题以促进深入学习。</think>在Pandas中使用`groupby`进行分组统计时,`as_index=False`参数可保持分组键作为普通列而非索引。结合`first()`方法可提取每组排序后的第一条记录。以下是具体示例解释: --- ### 一、`as_index=False`的作用 当使用`df.groupby("列名", as_index=False)`时: - **默认情况**(`as_index=True`):分组列会变成结果DataFrame的索引 - **设置`as_index=False`**:分组列保留为普通数据列,便于后续操作 ### 二、`first()`方法应用场景 配合排序后使用`first()`,可实现类似"获取每组最小值对应记录"的效果: ```python import pandas as pd # 示例数据 data = {'组别': ['A', 'A', 'B', 'B', 'B'], '数值': [3, 1, 5, 2, 4]} df = pd.DataFrame(data) # 按"数值"排序,再按"组别"分组取第一条 result = df.sort_values(by='数值').groupby('组别', as_index=False).first() print(result) ``` 输出: ``` 组别 数值 0 A 1 1 B 2 ``` ### 三、参数对比分析 | 代码片段 | 输出索引类型 | 分组列位置 | |---------|------------|------------| | `.groupby("组别")` | 组别为索引 | 索引列 | | `.groupby("组别", as_index=False)` | 数字索引 | 普通数据列 | ### 四、进阶用法 若需同时保留分组原始索引: ```python df.sort_values(by='数值').groupby('组别').first().reset_index() ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值