Pandas聚合
数据聚合
import pandas as pd
from pandas import Series
import numpy as np
# 准备数据
df = pd.DataFrame([[-0.204708,1.393406,'a','one'],
[0.478943,0.092908,'a','two'],
[-0.519439,0.281746,'b','one'],
[-0.555730,0.769023,'b','two'],
[1.965781,1.246435,'a','one']],columns=['data1','data2','key1','key2'])
df
data1 data2 key1 key2
0 -0.204708 1.393406 a one
1 0.478943 0.092908 a two
2 -0.519439 0.281746 b one
3 -0.555730 0.769023 b two
4 1.965781 1.246435 a one
# 先生成分组对象
grouped = df.groupby('key1')
# 执行具体的运算
grouped.quantile(0.9)
0.9 data1 data2
key1
a 1.668413 1.364012
b -0.523068 0.720295
# 自定义的方法(agg接收自定义函数)这种方式速度要慢的多,不太推荐。
def peak_to_peak(arr):
return arr.max() - arr.min()
grouped.agg(peak_to_peak)
data1 data2
key1
a 2.170489 1.300498
b 0.036291 0.487277
# 聚合运算也可以用describe()
grouped.describe().T
key1 a b
data1 count 3.000000 2.000000
mean 0.746672 -0.537584
std 1.109736 0.025662
min -0.204708 -0.555730
25% 0.137118 -0.546657
50% 0.478943 -0.537584
75% 1.222362 -0.528512
max 1.965781 -0.519439
data2 count 3.000000 2.000000
mean 0.910916 0.525385
std 0.712217 0.344557
min 0.092908 0.281746
25% 0.669671 0.403565
50% 1.246435 0.525385
75% 1.319920 0.647204
max 1.393406 0.769023
经过优化的groupby方法
| 函数名 | 说明 |
|---|---|
| count | 分组中非NA的数量 |
| sum | 非NA的和 |
| mean | 非NA值的平均值 |
| median | 非NA的算术中位数 |
| std、var | 无偏(分母n-1)标准差和方差 |
| min、max | 非NA值的最小值和最大值 |
| prod | 非NA值的积 |
| first、last | 第一个和最后一个非NA值 |
餐馆小费的数据
tips = pd.read_csv('C:/Users/1/Desktop/tips.csv')
tips[:6]
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
5 25.29 4.71 Male No Sun Dinner 4
# 小费占总额百分比的列
tips['tip_pct'] = tips['tip']/tips['total_bill']
tips[:6]
total_bill tip sex smoker day time size tip_pct
0 16.99 1.01 Female No Sun Dinner 2 0.059447
1 10.34 1.66 Male No Sun Dinner 3 0.160542
2 21.01 3.50 Male No Sun Dinner 3 0.166587
3 23.68 3.31 Male No Sun Dinner 2 0.139780
4 24.59 3.61 Female No Sun Dinner 4 0.146808
5 25.29 4.71 Male No Sun Dinner 4 0.186240
# 根据sex和smoker对tips进行分组
grouped1 = tips.groupby(['sex','smoker'])
# 直接将讲过优化的groupby方法传入
grouped1['tip_pct'].agg('mean')
sex smoker
Female No 0.156921
Yes 0.182150
Male No 0.160669
Yes 0.152771
Name: tip_pct, dtype: float64
# 如果传入一组函数或函数名,对应的列名就是函数名
grouped1['tip_pct'].agg(['mean','std',peak_to_peak])
mean std peak_to_peak
sex smoker
Female No 0.156921 0.036421 0.195876
Yes 0.182150 0.071595 0.360233
Male No 0.160669 0.041849 0.220186
Yes 0.152771 0.090588 0.674707
# 传入的是一个由(name,function)元组组成的列表,则元组的第一个元素会被当做列名
grouped1['tip_pct'].agg([('foo','mean'),('bar',np.std)])
foo bar
sex smoker
Female No 0.156921 0.036421
Yes 0.182150 0.071595
Male No 0.160669 0.041849
Yes 0.152771 0.090588
grouped['tip_pct','total_bill'].agg(['count','mean','max'])
tip_pct total_bill
count mean max count mean max
sex smoker
Female No 54 0.156921 0.252672 54 18.105185 35.83
Yes 33 0.182150 0.416667 33 17.977879 44.30
Male No 97 0.160669 0.291990 97 19.791237 48.33
Yes 60 0.152771 0.710345 60 22.284500 50.81
# 这里也可以传入带有自定义名称的元组列表,
ftuples = [('new1','mean'),('new2',np.var)]
grouped['tip_pct','total_bill'].agg(ftuples)
tip_pct total_bill
new1 new2 new1 new2
sex smoker
Female No 0.156921 0.001327 18.105185 53.092422
Yes 0.182150 0.005126 17.977879 84.451517
Male No 0.160669 0.001751 19.791237 76.152961
Yes 0.152771 0.008206 22.284500 98.244673
#传入字典
grouped.agg({'tip':np.max,'size':'sum'})
tip size
sex smoker
Female No 5.2 140
Yes 6.5 74
Male No 9.0 263
Yes 10.0 150
# 只有将多个函数应用到至少一列时,DataFrame才会拥有层次化的列
grouped.agg({'tip_pct':['min','max','mean','std'],'size':'sum'})
tip_pct size
min max mean std sum
sex smoker
Female No 0.056797 0.252672 0.156921 0.036421 140
Yes 0.056433 0.416667 0.182150 0.071595 74
Male No 0.071804 0.291990 0.160669 0.041849 263
Yes 0.035638 0.710345 0.152771 0.090588 150
# 以''无索引''的形式返回聚合数据
# 不需要的时候可以关闭所有的索引,包括层次化索引
tips.groupby(['sex','smoker'],as_index=False).mean()
sex smoker total_bill tip size tip_pct
0 Female No 18.105185 2.773519 2.592593 0.156921
1 Female Yes 17.977879 2.931515 2.242424 0.182150
2 Male No 19.791237 3.113402 2.711340 0.160669
3 Male Yes 22.284500 3.051167 2.500000 0.152771
Pandas聚合的更多相关文章
- pandas聚合和分组运算——GroupBy技术(1)
数据聚合与分组运算——GroupBy技术(1),有需要的朋友可以参考下. pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片.切块.摘要等操作.根据一个或多个 ...
- pandas聚合和分组运算之groupby
pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片.切块.摘要等操作.根据一个或多个键(可以是函数.数组或DataFrame列名)拆分pandas对象.计算分 ...
- pandas聚合aggregate
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/24 15:03 # @Author : zhang chao # @Fi ...
- pandas 聚合求和等操作
参考:https://blog.csdn.net/m0_38139979/article/details/106606633 result1= result.groupby(['user_id', ' ...
- python 数据处理学习pandas之DataFrame
请原谅没有一次写完,本文是自己学习过程中的记录,完善pandas的学习知识,对于现有网上资料的缺少和利用python进行数据分析这本书部分知识的过时,只好以记录的形势来写这篇文章.最如果后续工作定下来 ...
- Pandas教程目录
Pandas数据结构 Pandas系列 Pandas数据帧(DataFrame) Pandas面板(Panel) Pandas基本功能 Pandas描述性统计 Pandas函数应用 Pandas重建索 ...
- python操作dataFrame
python数据分析工具pandas中DataFrame和Series作为主要的数据结构. 本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数. 1)查看DataFrame数 ...
- Python Pandas分组聚合
Pycharm 鼠标移动到函数上,CTRL+Q可以快速查看文档,CTR+P可以看基本的参数. apply(),applymap()和map() apply()和applymap()是DataFrame ...
- Pandas系列(九)-分组聚合详解
目录 1. 将对象分割成组 1.1 关闭排序 1.2 选择列 1.3 遍历分组 1.4 选择一个组 2. 聚合 2.1 一次应用多个聚合操作 2.2 对DataFrame列应用不同的聚合操作 3. t ...
随机推荐
- document.ready(function(){}),window.onload,$(function(){})的区别
https://blog.csdn.net/qkzhx0516/article/details/79236514
- 解决jquery库和base库的冲突
jquery库引用在base库之前,$的所有权就是base库的:而jquery库引用在base库之前后的话,$的所有权就是jquery库的.解决这种库之间的冲突可用以下方法解决: 情况一,jquery ...
- JDK下载与安装、 Eclipse下载与使用、 Tomcat下载与使用、 MySQL安装与使用
前言 本文将介绍JDK的下载与安装,eclipse的下载与使用,Tomcat的下载与使用,MySQL的安装与使用. JDK下载与安装 一.JRE与JDK介绍 java是当前比较流行的一种编程语言,当我 ...
- python写service时全局变量问题
在尝试用flask写service的过程中,我发现全局变量使用虽然很方便,但其实是很冒险的. 本次我使用的是声明global变量的方式,如果作为本地的单次使用的程序来说,确实没有问题并且很好用,对于竞 ...
- javascript页面常用事件
事件名称 描述 onload和 onunload(已过时) 当用户进入或离开页面时就会触发onload和onunload事件,onload是页面所有元素都加载完之后才加载onload onfocus, ...
- 运行gunicorn失败:[ERROR] Connection in use: ('0.0.0.0', 8000)
参考:https://pdf-lib.org/Home/Details/5262 执行命令:gunicorn -w 4 -b 0.0.0.0:8000 wsgi:app,遇到如下错误: [2019-0 ...
- laravel whereNotIn where子查詢
子查詢寫法 $stores = Stores::select('id','name')->whereNotIn('id', function ($query) use($id){ $query- ...
- <亲测>centos7通过yum安装JDK1.8(实际上是openjdk)
centos7通过yum安装JDK1.8 安装之前先检查一下系统有没有自带open-jdk 命令: rpm -qa |grep java rpm -qa |grep jdk rpm -qa |gr ...
- Ajax请求的几个小练习
Ajax请求的几个小练习 准备工作 路由中做了分发: re_path('^app01/',include('app01.url')) app01中url.py文件的内容: from django.ur ...
- DevExpress的42种窗体样式
在Winform环境下DevExpress标题栏皮肤 第一步:引用DLL文件,安装DevExpress后在引用>程序集>扩展: DevExpress.BonusSkins.v12.2.dl ...