pandas数据分组和聚合操作方法

作者:Shingle_ 时间:2023-09-07 05:15:44 

《Python for Data Analysis》

GroupBy

分组运算:split-apply-combine(拆分-应用-合并)

DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。然后,将一个函数应用到各个分组并产生新值。最后,所有这些函数的执行结果会被合并到最终的结果对象中去。

GroupBy的size方法可以返回一个含有分组大小的Series。

对分组进行迭代


for (k1,k2), group in df.groupby(['key1','key2']):
print k1,k2
print group

选取一个或一组列


df.groupby(['key1','key2'])[['data2']].mean()

通过字典或Series进行分组

只需将字典或Series传给groupby即可。

通过函数分组

people.groupby(len).sum() #根据人名的长度进行分组

通过索引级别分组

层次化索引数据,根据索引级别进行聚合,通过level关键字传入级别编号或名称。


df.groupby(level='cty',axis=1).count()

数据聚合

经过优化的groupby方法

函数名说明
count分组中非NA值得数量
sum非NA值的和
mean非NA值的平均值
median非NA值的算术平均数
std、var无偏(分母为n-1)标准差和方差
min、max非NA值的最小值和最大值
prod非NA值的积
first、last第一个和最后一个非NA值

对于上述描述统计方法,可以将函数名以字符串的形式传入agg方法。例如:grouped.agg(['mean', 'std'])

如果要使用自己的聚合函数,只需将其传入aggregate或agg方法即可


def peak_to_peak(arr):
return arr.max() - arr.min()
grouped.agg(peak_to_peak)

面向列的多函数应用,可以对不同的列使用不同的聚合函数或者一次应用多个函数。

如果传入一组函数或函数名,得到的DataFrame的列就会以相应的函数命名

如果传入的是一个由(name,function)元组组成的列表,各个元组的第一个元素就会被用作DataFrame的列名。

不同的列使用不同的聚合函数也可以向agg传入一个从列名映射到函数的字典


grouped.agg(['mean', 'std', peak_to_peak]) # 1
grouped.agg([('foo', 'mean'), ('bar', np.std)]) # 2
functions = ['count', 'mean', 'max']
result = grouped['tip', 'bill'].agg(functions) # 3
grouped.agg({'tip' : np.max, 'bill' : 'sum'}) # 4

分组级运算和转换

transform

transform会将一个函数应用到各个分组,然后将结果放置到适当的位置上。如果各个分组产生的是一个标量值,则该值就会被广播出去。

apply

一般性的“拆分-应用-合并”

tips.groupby('smoker').apply(top)相当于top函数在DataFrame的各个片段上调用,然后结果由pandas.concat组装到一起,并以分组名称进行了标记。,于是,最终结果就有了一个层次化索引,其内层索引值来自于原DataFrame.

禁止分组键: 分组键会跟原始对象的索引共同构成结果对象中的层次化索引。将group_keys=False传入groupby即可禁止该效果。tips.groupby('smoker', group_keys=False).apply(top)

在GroupBy对象上调用describe相当于f = lambda x : x.describe(); grouped.apply(f).

数据汇总工具

透视表 pivot_table

根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域。


tips.pivot_table('tip_pct', index=['time', 'size', 'smoker'],
columns='day', aggfunc='mean', fill_value=0)

参数名说明
values待聚合的列的名称。默认所有列
rows用于分组的列名或者其他分组键,出现在结果透视表的行
cols用于分组的列名或者其他分组键,出现在结果透视表的列
aggfunc聚合函数或函数列表,默认“mean”。可以是任何对groupby有效的函数
fill_value用于替换结果表中缺失值
margins添加行/列小计和总计,默认为False

交叉表 crosstab

是一种用于计算分组频率的特殊透视表。


pd.crosstab([tips.time, tips.day], tips.smoker, margins=True)

来源:https://blog.csdn.net/Shingle_/article/details/72677135

标签:pandas,数据,分组,聚合
0
投稿

猜你喜欢

  • Python爬虫+Tkinter制作一个翻译软件的示例

    2023-12-14 07:22:42
  • Python3 获取一大段文本之间两个关键字之间的内容方法

    2022-01-17 15:03:31
  • mysql的存储过程、游标 、事务实例详解

    2024-01-12 22:02:15
  • 关于jquery css的使用介绍

    2024-04-22 22:21:45
  • python 30行代码实现蚂蚁森林自动偷能量

    2021-07-20 03:04:28
  • Idea开发工具之SpringBoot整合JSP的过程

    2023-06-14 19:50:23
  • oracle应用程序实现打包 的方法

    2009-03-02 10:32:00
  • MySQL中多个left join on关联条件的顺序说明

    2024-01-15 14:01:46
  • Anaconda+Pycharm环境下的PyTorch配置方法

    2023-05-20 16:38:22
  • python:pandas合并csv文件的方法(图书数据集成)

    2021-06-22 09:34:40
  • 谈PHP生成静态页面分析 模板+缓存+写文件

    2023-11-14 12:44:39
  • python的等深分箱实例

    2022-11-30 01:01:20
  • educoder之Python数值计算库Numpy图像处理详解

    2023-12-06 03:49:32
  • python代数式括号有效性检验示例代码

    2022-04-29 04:49:49
  • 解决PyCharm不运行脚本,而是运行单元测试的问题

    2023-04-12 01:08:53
  • 基于pandas中expand的作用详解

    2022-02-04 06:53:53
  • python+opencv打开摄像头,保存视频、拍照功能的实现方法

    2021-06-12 15:16:02
  • python3.9之你应该知道的新特性详解

    2021-09-01 12:13:42
  • python和flask中返回JSON数据的方法

    2023-07-31 02:43:17
  • Vue 中使用 typescript的方法详解

    2024-05-09 15:10:12
  • asp之家 网络编程 m.aspxhome.com