数据分析-Pandas的核心操作groupby简介

数据分析-Pandas的核心操作groupby简介

数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律?

数据表,时间序列数据在数据分析建模中很常见,例如天气预报,空气状态监测,股票交易等金融场景。数据分析过程中重新调整,重塑数据表是很重要的技巧,此处选择Titanic数据,以及巴黎、伦敦欧洲城市空气质量监测 N O 2 NO_2 NO2数据作为样例。

数据分析

数据分析-Pandas如何转换产生新列

数据分析-Pandas如何统计数据概况

数据分析-Pandas如何轻松处理时间序列数据

数据分析-Pandas如何选择数据子集

数据分析-Pandas如何重塑数据表-CSDN博客

实验数据分析处理,股票序列,时间序列,信号序列,有时候表格的数据需要进行分类,拆分,分组处理,,针对每组进行分类处理,处理后的结果还想汇总起来。这是pandas很常见的使用场景,pandas如何通过groupby,分步骤进行数据分类、处理、汇总呢?

Group by的意义:split-apply-combine

通过"group by",是包含以下一项或多项的步骤:

  • 拆分:根据某些条件将数据拆分为几组。
  • 应用:对每个组进行独立的函数操作。
  • 合并:将结果合并到一定数据结构中。

其中,拆分步骤的操作就是字面的意思,最直接直白的。

而在应用步骤中,可能希望执行下列操作之一:

  • 聚合:为每个分组计算汇总统计量,统计数据。例如:

    • 计算组总和或均值。
    • 计算组大小/计数。
  • 转换:执行一些特定组的计算,并返回一个 like-indexed 对象。例如:

    • 标准化操作分组的数据 (zscore)。
    • 填充NA值,使用每个组派生计算的值填充组内的 NA。
  • 过滤:筛掉一些分组,根据组为单位计算,筛选条件计算结果为 True 或 False。例如:

    • 丢弃占比低,少数成员的组数据。
    • 根据总和或平均值来筛选分组。

其中许多操作是在 GroupBy 对象上定义的,例如聚合 API窗口 API重采样 API。

也有有这样可能情况,例如给定的操作并没有落入到任何一个分类数据中,或者只是一些分组合并。

在这些情形下,最合适的可能就是使用GroupBy计算。这样的计算会检查应用计算步骤后的结果,并且尽量把这些分组结果合并为一个最后结果,当如果这些并不适合上述的类型数据。

使用内置 GroupBy ,把一个操作拆分为多个步骤,比用户定义的 Python 函数更有效。

当然,GroupBy 这个名字,对于使用过的SQL语言人来说,应该很熟悉,您会常常编写如下代码:

SELECT Column1, Column2, mean(Column3), sum(Column4)
FROM SomeTable
GROUP BY Column1, Column2

我们的目标是通过pandas,让这些操作更加自然,容易表达。后续我们将讨论各个方面的 GroupBy 的功能,同时提供一些样例。

Splitting拆分

分组的抽象定义是提供映射规则把数据映射到分组,标签。创建 GroupBy 对象,您可以执行以下操作:

python 复制代码
In [1]: speeds = pd.DataFrame(
   ...:     [
   ...:         ("bird", "Falconiformes", 389.0),
   ...:         ("bird", "Psittaciformes", 24.0),
   ...:         ("mammal", "Carnivora", 80.2),
   ...:         ("mammal", "Primates", np.nan),
   ...:         ("mammal", "Carnivora", 58),
   ...:     ],
   ...:     index=["falcon", "parrot", "lion", "monkey", "leopard"],
   ...:     columns=("class", "order", "max_speed"),
   ...: )
   ...: 

In [2]: speeds
Out[2]: 
          class           order  max_speed
falcon     bird   Falconiformes      389.0
parrot     bird  Psittaciformes       24.0
lion     mammal       Carnivora       80.2
monkey   mammal        Primates        NaN
leopard  mammal       Carnivora       58.0

In [3]: grouped = speeds.groupby("class")

In [4]: grouped = speeds.groupby(["class", "order"])

可以通过多种不同的方式指定映射:

  • Python 函数,被每个索引标签调用 。
  • 列表或 NumPy 数组,与索引长度相同。
  • 字典 或 序列,提供label -> group name映射。
  • 对于DataFrame对象,字符串标定的列名或 用于索引级别分组。
  • 列表包含上述任何一项。

总之,将分组对象统称为。例如, 考虑以下几点:

python 复制代码
In [5]: df = pd.DataFrame(
   ...:     {
   ...:         "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
   ...:         "B": ["one", "one", "two", "three", "two", "two", "one", "three"],
   ...:         "C": np.random.randn(8),
   ...:         "D": np.random.randn(8),
   ...:     }
   ...: )
   ...: 

In [6]: df
Out[6]: 
     A      B         C         D
0  foo    one  0.469112 -0.861849
1  bar    one -0.282863 -2.104569
2  foo    two -1.509059 -0.494929
3  bar  three -1.135632  1.071804
4  foo    two  1.212112  0.721555
5  bar    two -0.173215 -0.706771
6  foo    one  0.119209 -1.039575
7  foo  three -1.044236  0.271860

DataFrame 的groupby

在 DataFrame 上,可以通过调用 groupby方法返回,来获取 GroupBy 对象。 可以按A 或B 列,或两者结合进行分组:

python 复制代码
In [7]: grouped = df.groupby("A")

In [8]: grouped = df.groupby("B")

In [9]: grouped = df.groupby(["A", "B"])

实际上,df.groupby('A') 和 df.groupby(df['A']) 效果是一致的。

如果我们在列 A 和 B上设置多标签 MultiIndex,可以按所有列, 除了指定的列以外:

python 复制代码
In [10]: df2 = df.set_index(["A", "B"])
In [11]: grouped = df2.groupby(level=df2.index.names.difference(["B"]))

In [12]: grouped.sum()
Out[12]: 
            C         D
A                      
bar -1.591710 -1.739537
foo -0.752861 -1.402938

上面的 GroupBy 将拆分其索引(行)上的 DataFrame。要按列拆分,首先要执行 转置:

python 复制代码
In [13]: def get_letter_type(letter):
   ....:     if letter.lower() in 'aeiou':
   ....:         return 'vowel'
   ....:     else:
   ....:         return 'consonant'
   ....: 

In [14]: grouped = df.T.groupby(get_letter_type)

Pandas 的index 对象支持重复值。如果 非唯一索引用作 GroupBy 操作中的组键,所有值 对于相同的索引值将被视为在一组中,因此 聚合函数的输出将仅包含唯一的索引值,例如:

python 复制代码
In [15]: index = [1, 2, 3, 1, 2, 3]

In [16]: s = pd.Series([1, 2, 3, 10, 20, 30], index=index)

In [17]: s
Out[17]: 
1     1
2     2
3     3
1    10
2    20
3    30
dtype: int64

In [18]: grouped = s.groupby(level=0)

In [19]: grouped.first()
Out[19]: 
1    1
2    2
3    3
dtype: int64

In [20]: grouped.last()
Out[20]: 
1    10
2    20
3    30
dtype: int64

In [21]: grouped.sum()
Out[21]: 
1    11
2    22
3    33
dtype: int64

请注意,只有需要才会进行拆分。创建 GroupBy 对象 仅验证您是否已通过有效的映射。

以上代码只是一个简单示例,示例代码中的表达式可以根据实际问题进行修改。

后续介绍下其他的操作。

觉得有用 收藏 收藏 收藏

点个赞 点个赞 点个赞

End

GPT专栏文章:

GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案

GPT实战系列-LangChain + ChatGLM3构建天气查询助手

大模型查询工具助手之股票免费查询接口

GPT实战系列-简单聊聊LangChain

GPT实战系列-大模型为我所用之借用ChatGLM3构建查询助手

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)

GPT实战系列-ChatGLM2模型的微调训练参数解读

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案

GPT实战系列-Baichuan2本地化部署实战方案

GPT实战系列-Baichuan2等大模型的计算精度与量化

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-探究GPT等大模型的文本生成-CSDN博客

相关推荐
赵钰老师33 分钟前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
Lx3522 小时前
Pandas数据重命名:列名与索引为标题
后端·python·pandas
小白学大数据3 小时前
高级技术文章:使用 Kotlin 和 Unirest 构建高效的 Facebook 图像爬虫
爬虫·数据分析·kotlin
lovelin+v1750304096618 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
道一云黑板报19 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes
数据爬坡ing19 小时前
小白考研历程:跌跌撞撞,起起伏伏,五个月备战历程!!!
大数据·笔记·考研·数据分析
matlabgoodboy1 天前
数据分析帮做spss数据代分析stata实证python统计R语言eviews处理
python·数据分析·r语言
終不似少年遊*1 天前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
陆沙1 天前
生物信息学导论-北大-RNA-Seq数据分析
数据分析·生物信息·生信
Watermelo6171 天前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript