TOOLS_Pandas groupby 分组聚合常用方法使用示例

2023-11-15

TOOLS_Pandas groupby 分组聚合常用方法使用示例

  • 根据给定列中的不同值对数据点(行)进行分组;
  • 分组后的数据可以计算生成组的聚合值;

注意:下文仅是常用的一些示例,实际操作时可组合使用的方式要多得多

import pandas as pd
df = pd.read_excel("./工作簿1.xlsx")
df.head()
store product_group product_code stock_qty cost price last_week_sales last_month_sales
0 Violet PG1 4187 498 420.76 569.91 13 58
1 Rose PG2 4195 473 545.64 712.41 16 58
2 Violet PG2 4204 968 640.42 854.91 22 88
3 Daisy PG1 4219 241 869.69 1034.55 14 45
4 Daisy PG2 4718 1401 12.54 26.59 50 285

n列分组n特征列n聚合

# 单列分组——所有数值型特征列——单聚合
df.groupby("store").mean() 

# 单列分组——单特征列——单聚合
df.groupby("store")["price"].mean() 

# 多列分组——多特征列——多聚合
df.groupby(["store","product_group"])[["cost","price"]].agg(["mean","max"]) 

cost price
mean max mean max
store product_group
Daisy PG1 869.69 869.69 1034.55 1034.55
PG2 12.54 12.54 26.59 26.59
Rose PG2 545.64 545.64 712.41 712.41
Violet PG1 420.76 420.76 569.91 569.91
PG2 640.42 640.42 854.91 854.91

对聚合结果进行命名

df.groupby("store").agg(
    mean_price = ("price", "mean"),
    max_price = ("price", "max"),
    mean_cost =  ("cost", "mean"),
    max_cost = ("cost", "max"),
)

mean_price max_price mean_cost max_cost
store
Daisy 530.57 1034.55 441.115 869.69
Rose 712.41 712.41 545.640 545.64
Violet 712.41 854.91 530.590 640.42

as_index 参数

  • 如果groupby输出的是DataFrame,可以使用该参数将分组的列(默认会被处理为索引列)加入到结果的DataFrame中(转换为特征列);
df.groupby("store", as_index=False).agg(
    mean_price = ("price", "mean"),
    max_price = ("price", "max"),
    mean_cost =  ("cost", "mean"),
    max_cost = ("cost", "max"),
)

store mean_price max_price mean_cost max_cost
0 Daisy 530.57 1034.55 441.115 869.69
1 Rose 712.41 712.41 545.640 545.64
2 Violet 712.41 854.91 530.590 640.42

dropna 参数

groupby函数默认会忽略分组的缺省值:如果用于分组的列中缺少值,那么它将不被包含到任何组中,也不会单独显示;

使用dropna参数可以改变这一行为;

df.loc[5] = [None, "PG2", 1000,120,60,90,15,50]
df.groupby("store", dropna=False)["price"].mean()

store
Daisy     530.57
Rose      712.41
Violet    712.41
NaN        90.00
Name: price, dtype: float64

排序输出

  • 使用sort_values函数根据聚合列多输出进行排序
df.groupby("store", as_index=False).agg(
    mean_price = ("price", "mean"),
    max_price = ("price", "max"),
    mean_cost =  ("cost", "mean"),
    max_cost = ("cost", "max"),
).sort_values(by="mean_price", ascending=False)

store mean_price max_price mean_cost max_cost
1 Rose 712.41 712.41 545.640 545.64
2 Violet 712.41 854.91 530.590 640.42
0 Daisy 530.57 1034.55 441.115 869.69

某一列的Top N

  • max() 取最大值
  • nlargest(N)nsmallest(N) 取前N个最值
df.groupby("store")["price"].max()
df.groupby("store")["price"].nlargest(2)

store    
Daisy   3    1034.55
        4      26.59
Rose    1     712.41
Violet  2     854.91
        0     569.91
Name: price, dtype: float64

第N个值

  • 先排序,再取值
df_sorted = df.sort_values(by=["store","price"], ascending=False, ignore_index=True)
# ignore_index参数,会重置索引

# 找到每个分组中的第一个值(按照price倒序,对应的就是每组中price最高的一条记录)
df_sorted.groupby("store", as_index=False).nth(0)

# 找到每个分组中的最后一个值(按照price倒序,对应的就是每组中price最低的一条记录)
df_sorted.groupby("store", as_index=False).nth(-1)


store product_group product_code stock_qty cost price last_week_sales last_month_sales
1 Violet PG1 4187 498 420.76 569.91 13 58
2 Rose PG2 4195 473 545.64 712.41 16 58
4 Daisy PG2 4718 1401 12.54 26.59 50 285

唯一值、唯一值的数量

  • unique函数 查找每组中的唯一值
  • nunique函数 统计每组中唯一值的数量
df.groupby("store", as_index=False).agg(
    unique_val = ("product_code", "unique")
)
store unique_val
0 Daisy [4219, 4718]
1 Rose [4195]
2 Violet [4187, 4204]
df.groupby("store", as_index=False).agg(
    number_unique_val = ("product_code", "nunique")
)
store number_unique_val
0 Daisy 2
1 Rose 1
2 Violet 2

组的个数

# 两列的组合数
df.groupby(["store", "product_group"]).ngroups

5

获取特定分组

asign_pg1 = df.groupby(
    ["store", "product_group"]
).get_group(("Daisy", "PG1"))

asign_pg1

store product_group product_code stock_qty cost price last_week_sales last_month_sales
3 Daisy PG1 4219 241 869.69 1034.55 14 45

Lambda

  • 在agg函数中使用lambda表达式,自定义聚合操作
df.groupby("store").agg(
    test_p = ("price", lambda x: round(x.sum()/1000, 1))
)
test_p
store
Daisy 1.1
Rose 0.7
Violet 1.4

apply函数

  • 使用apply函数将Lambda表达式应用到每个组。
  • 例如,我们可以计算每家店利润值;
df.groupby("store").apply(
    lambda x: (x.price - x.cost).sum()
)
store
Daisy     178.91
Rose      166.77
Violet    363.64
dtype: float64

expanding 函数

import numpy as np

df = pd.DataFrame(
    {
      "date": pd.date_range(start="2022-08-01", periods=8, freq="D"),
      "category": list("AAAABBBB"),
      "value": np.random.randint(10, 30, size=8)
    }
)
df
date category value
0 2022-08-01 A 26
1 2022-08-02 A 25
2 2022-08-03 A 29
3 2022-08-04 A 10
4 2022-08-05 B 25
5 2022-08-06 B 18
6 2022-08-07 B 24
7 2022-08-08 B 15
# 累计总和
df["cum_sum"] = df.groupby("category")["value"].cumsum()
df

date category value cum_sum
0 2022-08-01 A 26 26
1 2022-08-02 A 25 51
2 2022-08-03 A 29 80
3 2022-08-04 A 10 90
4 2022-08-05 B 25 25
5 2022-08-06 B 18 43
6 2022-08-07 B 24 67
7 2022-08-08 B 15 82
# expanding函数提供展开转换。但是对于展开以后的操作还是需要一个累计函数来堆区操作
df["cum_sum2"] = df.groupby("category")["value"].expanding().sum().values
df

date category value cum_sum cum_sum2
0 2022-08-01 A 26 26 26.0
1 2022-08-02 A 25 51 51.0
2 2022-08-03 A 29 80 80.0
3 2022-08-04 A 10 90 90.0
4 2022-08-05 B 25 25 25.0
5 2022-08-06 B 18 43 43.0
6 2022-08-07 B 24 67 67.0
7 2022-08-08 B 15 82 82.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TOOLS_Pandas groupby 分组聚合常用方法使用示例 的相关文章

  • numpy python 中的“AttributeError:'matrix'对象没有属性'strftime'”错误

    我有一个维度为 72000 1 的矩阵 该矩阵涉及时间戳 我想使用 strftime 如下所示 strftime d m y 为了得到像这样的输出 11 03 02 我有这样一个矩阵 M np matrix timestamps 我使用了
  • ctypes 错误:libdc1394 错误:无法初始化 libdc1394

    我正在尝试将程序编译为共享库 我可以使用 ctypes 在 Python 代码中使用该库 使用以下命令该库可以正常编译 g shared Wl soname mylib O3 o mylib so fPIC files pkg config
  • 从 Python 下载/安装 Windows 更新

    我正在编写一个脚本来自动安装 Windows 更新 我可以将其部署在多台计算机上 这样我就不必担心手动更新它们 我想用 Python 编写这个 但找不到任何关于如何完成此操作的信息 我需要知道如何搜索更新 下载更新并从 python 脚本安
  • 从sklearn PCA获取特征值和向量

    如何获取 PCA 应用程序的特征值和特征向量 from sklearn decomposition import PCA clf PCA 0 98 whiten True converse 98 variance X train clf f
  • Python 是解释型的还是编译型的,或者两者兼而有之?

    据我了解 An 解释的语言是由解释器 将高级语言转换为机器代码然后执行的程序 实时运行和执行的高级语言 它一次处理一点程序 A compiled语言是一种高级语言 其代码首先由编译器 将高级语言转换为机器代码的程序 转换为机器代码 然后由执
  • 使用 NLTK 在 Python 中获取大量名词(或形容词);或 Python Mad Libs

    Like 这个问题 https stackoverflow com questions 7439555 noun adjective etc word lists or dictionaries common words 我有兴趣按词性获取
  • 如何在VIM中设置文件的正确路径?

    每当我击中 pwd在 vim 中命令总是返回路径C Windows system32 即使我在桌面上的 Python 文件中 所以每当我跑步时 python 命令返回 python can t open file Users myname
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • 编辑 Jupyter Notebook 时 VS Code 中缺少“在选择中查找”

    使用 Jupyter Notebook 时 VSCode 中缺少 在选择中查找 按钮 它会减慢开发速度 所以我想请问有人知道如何激活它吗 第一张图显示了在 python 文件中的搜索 替换 第二张图显示了笔记本电脑中缺少的按钮 Python
  • ValueError:不支持连续[重复]

    这个问题在这里已经有答案了 我正在使用 GridSearchCV 进行线性回归的交叉验证 不是分类器也不是逻辑回归 我还使用 StandardScaler 对 X 进行标准化 我的数据框有 17 个特征 X 和 5 个目标 y 观察 约11
  • Python:我不明白 sum() 的完整用法

    当然 我明白你使用 sum 与几个数字 然后它总结所有 但我正在查看它的文档 我发现了这一点 sum iterable start 第二个参数 start 的作用是什么 这太尴尬了 但我似乎无法通过谷歌找到任何示例 并且对于尝试学习该语言的
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • 为什么我应该使用 WSGI?

    使用 mod python 一段时间了 我读了越来越多关于 WSGI 有多好的文章 但没有真正理解为什么 那么我为什么要切换到它呢 有什么好处 这很难吗 学习曲线值得吗 为了用 Python 开发复杂的 Web 应用程序 您可能会使用更全面
  • 在 Spyder 的变量资源管理器中查看局部变量

    我是 python 新手 正在使用 Spyder 的 IDE 我欣赏它的一项功能是它的变量资源管理器 然而 根据一些研究 我发现它只显示全局变量 我找到的解决方法是使用检查模块 import inspect local vars def m
  • 在 Windows 上使用带有对数刻度的 matplotlib 时出现 Unicode 错误

    我正在使用 python 2 6 和 matplotlib 如果我运行 matplotlib 库页面中提供的示例 histogram demo py 它工作正常 我已经大大简化了这个脚本 import numpy as np import
  • PIL - 需要抖动,但限制调色板会导致问题

    我是 Python 新手 正在尝试使用 PIL 来执行 Arduino 项目所需的解析任务 这个问题涉及到Image convert 方法以及调色板 抖动等选项 我有一些硬件能够一次仅显示 16 种颜色的图像 但它们可以指定为 RGB 三元
  • 附加两个具有相同列、不同顺序的数据框

    我有两个熊猫数据框 noclickDF DataFrame 0 123 321 0 1543 432 columns click id location clickDF DataFrame 1 123 421 1 1543 436 colu
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0

随机推荐

  • Java 对象

    Java对象是Java语言中最重要的概念之一 它允许开发人员将数据和方法组合在一起 创建具有自己行为和状态的实体 本文将详细介绍Java对象的概念 特性以及在实际工作中的应用 Java对象的概念和特性 在Java中 对象是类的实例 类是一个
  • QGis二次开发基础 -- 构建图层管理器

    为了回应有些同学对上一篇博文的建议 这篇文章主要关注于QGis二次开发中的 图层管理器 的实现 使用QGis构建独立应用系统 我相信大部分同学应该还是关注于GIS基本功能框架构建上 也就是一些基本的GIS功能 例如 数据的显示 漫游浏览等
  • 徐泽阳:7.19黄金原油行情走势分析,操作思路解读

    黄金消息面与基本面解析 周一 7月19日 现货黄金小幅上涨 上周五 7月16日 金价跌近1 主要因为零售销售意外增长提振美元指数上涨 不过消费者信心指数下跌以及股市下滑限制了金价跌势 黄金守在每盎司1800美元上方 但分析师表示 一个关键驱
  • Altium designer (AD)软件3D视图下怎么让背景色变为白色

    首先切换到PCB文件下 打开3D预览视图 快捷键为数字3 或者依次点击 视图 切换到3维模式 之后点击View configuration 点击System color 将 Workspace in 3D mode 的颜色更改为白色即可
  • en结尾的单词_以en结尾的英语单词

    展开全部 以e68a84e8a2ad62616964757a686964616f31333431353236en结尾的英语单词有很多 比如widen 使 加宽 broaden 使 扩宽 brighten 使 明亮 lighten减轻 点亮
  • 从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    更多资讯 请关注 Ai尚研修科研技术动态 公众号 我国高分辨率对地观测系统重大专项已全面启动 高空间 高光谱 高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成 将成为保障国家安全的基础性和战略性资源 随着小卫星星座的普
  • Java 集合 --- Collection 框架

    Java 集合 Collection 框架 Collection Interface Concrete Implementations LinkedList ArrayList ArrayList 和 LinkedList的区别 Queue
  • 丢失OCR,Voting Disk后如何重建

    在10gR2的RAC中 Votedisk只能通过dd进程备份 假设没有Votedisk备份或OCR也损坏且没有备份 那么可以重新执行节点的root sh脚本来初始化Votedisk和OCR 之后使用VIPCA RACGONS SRVCTL等
  • Linux系统中查看可执行程序的所在目录

    前言 在嵌入式开发中 有时候需要知道可执行程序的所在目录 在工作中 遇到一次定制开发 是集成对方公司的算法 对方要求把模型文件放到和可执行程序相同的目录下 当时完全不知道可执行程序在设备的哪个目录 因为没有遇到过也没有思考过这个问题 当时也
  • 快速排序和归并排序哪个快?

    两个排序的基本思想都是分治 分而治之 实现一般都使用递归实现 1 快速排序 双边指针 交换法 记录分界值 创建左右指针 记录下标 以第一个元素为分界值 先从右向左找出比分界值小的数据 然后从左向右找出比分界值大的数据 左右指针下标未过界 交
  • 30K的月薪,是个什么段位?

    Java程序员30K的月薪 是个什么段位 大家可以参照BAT等一线大厂的职级 一般是高级工程师和资深工程师的职位 在阿里是p6 p7左右 在百度是t5左右 腾讯是t2 3左右 在京东是t3 1 美团是p6左右 掌握的技能树主要包含哪个方面
  • 【SEAN的日志】如何突破微信小程序2M限制?

    微信小程序限制2M大小一直是很多开发者的痛 我也是其中之一 网上已经有分包的解决方案 即使用subPackages 具体使用网上已经有很多教程我这里就不多赘述了 当大家可能有需求需要在小程序上实现比较复杂的功能时就需要引入各种库 而wx小程
  • Java方法重载与方法重写的区分

    在Java的学习与开发中我们经常要用到方法重载和方法重写 那么这两个概念有什么区别呢 一 方法重载 Overload 重载 overloading 是在一个类里面 方法名字相同 而参数不同 返回类型可以相同也可以不同 每个重载的方法 或者构
  • jquery/js input 输入金额或者文字放大显示

  • Android 调用系统发短信界面,给指定号码发短信,并带短信内容

    工具类如下ContentUtil java package com zhoucj messagedemo util import android content Context import android content Intent i
  • 这里有好多小巧的绿色工具呀,感觉是神级的

    http www nirsoft net
  • 训练yolo时报错RuntimeError: result type Float can‘t be cast to the desired output type __int64个人解决方案

    运行YOLOv5 6 1和yolor的时候 训练都没能正常运行 均出现了如下错误 AutoAnchor 5 00 anchors target 1 000 Best Possible Recall BPR Current anchors a
  • QT入门Buttons之QToolButton

    目录 一 界面布局介绍 1 布局器中的位置及使用 2 控件的界面属性 2 1对象名称和大小设置 2 2对象文本设置和鼠标箭头更改 2 3 扁平化样式 二 属性功能介绍 1 显示箭头属性 2 按钮风格 3 添加默认action属性 三 Dem
  • 第一次护网HW心得

    以下内容为本人参加第一次护网HW的心得 纯属个人体会 大家看着玩就好 文章目录 背景 实战理解 背景 我开始接触实战 是从某省的第五届网络空间安全竞赛开始的 我参加过第四届比赛 是标准的CTF形式 初赛线上做题 决赛线下AWD攻防 但第五届
  • TOOLS_Pandas groupby 分组聚合常用方法使用示例

    TOOLS Pandas groupby 分组聚合常用方法使用示例 根据给定列中的不同值对数据点 行 进行分组 分组后的数据可以计算生成组的聚合值 注意 下文仅是常用的一些示例 实际操作时可组合使用的方式要多得多 import pandas