2018.03.28 python-pandas groupby使用
groupby 分组统计
1.根据某些条件将数据分组
2.对每个组独立应用函数
3.将结果合并到一个数据结构中
Dataframe在行或列上分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中
#分组
import numpy as np
import pandas as pd
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)})
print(df)
print('------')
print(df.groupby('A'),type(df.groupby('A')))
#直接分组得到的是groupby对象,是一个中间数据,没有进行计算
print(df.groupby('A').sum())#自动过滤字符串列
print(df.groupby('A').mean())#平均值
b = df.groupby(['A','B']).mean()
print(b,type(b),'\n',b.columns)
c = df.groupby(['A'])['D'].mean()#以A分组,取D列平均值
print(c,type(c),'\n')
结果:
A B C D
0 foo one 0.429615 -0.708782
1 bar one 0.891751 1.140575
2 foo two -0.261858 -0.516835
3 bar three 1.310361 0.269657
4 foo two 1.048076 1.374218
5 bar two -0.410148 1.061132
6 foo one -1.124137 -0.729367
7 foo three 0.289513 0.892714
------
<pandas.core.groupby.DataFrameGroupBy object at 0x000000000FBACA58> <class 'pandas.core.groupby.DataFrameGroupBy'>
C D
A
bar 1.791963 2.471364
foo 0.381208 0.311947
C D
A
bar 0.597321 0.823788
foo 0.076242 0.062389
C D
A B
bar one 0.891751 1.140575
three 1.310361 0.269657
two -0.410148 1.061132
foo one -0.347261 -0.719074
three 0.289513 0.892714
two 0.393109 0.428691 <class 'pandas.core.frame.DataFrame'>
Index(['C', 'D'], dtype='object')
A
bar 0.823788
foo 0.062389
Name: D, dtype: float64 <class 'pandas.core.series.Series'>
#分组 - 可迭代的对象
df = pd.DataFrame({'X':['A','B','A','B'],'Y':[1,3,4,2]})
print(df)
print(df.groupby('X'),type(df.groupby('X')))
print('-------')
print(list(df.groupby('X')),'->可迭代对象,直接生成list\n')
print(list(df.groupby('X'))[0],'->以元组的形式显示')
for n,g in df.groupby('X'):
print(n)
print(g)
print('###')
print('--------')
#n是组名,g是分组后的DataFrame
print(df.groupby(['X']).get_group('A'),'\n')
print(df.groupby(['X']).get_group('B'),'\n')
#.get_group提取分组后的组 grouped = df.groupby(['X'])
print(grouped.groups)
print(grouped.groups['A'])#也可写 df.groupby('X').groups['A']
print('-------')
#.groups:将分组后的groups转化为dict
#可以字典索引方法来查看groups里的元素 sz = grouped.size()
print(sz,type(sz))
#.size() 查看分组后的长度
print('---------')
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)})
grouped = df.groupby(['A','B']).groups
print(df)
print(grouped)
print(grouped['foo','three']) dic=dict({'A':[1,2,3],
'B':[2,3,4]})
print(dic,type(dic))
结果:
X Y
0 A 1
1 B 3
2 A 4
3 B 2
<pandas.core.groupby.DataFrameGroupBy object at 0x000000000F889F60> <class 'pandas.core.groupby.DataFrameGroupBy'>
-------
[('A', X Y
0 A 1
2 A 4), ('B', X Y
1 B 3
3 B 2)] ->可迭代对象,直接生成list
('A', X Y
0 A 1
2 A 4) ->以元组的形式显示
A
X Y
0 A 1
2 A 4
###
B
X Y
1 B 3
3 B 2
###
--------
X Y
0 A 1
2 A 4
X Y
1 B 3
3 B 2
{'A': Int64Index([0, 2], dtype='int64'), 'B': Int64Index([1, 3], dtype='int64')}
Int64Index([0, 2], dtype='int64')
-------
X
A 2
B 2
dtype: int64 <class 'pandas.core.series.Series'>
---------
A B C D
0 foo one -0.881923 -0.825102
1 bar one -0.626412 -0.618638
2 foo two -1.741248 1.557698
3 bar three 1.076928 1.738265
4 foo two -0.954103 -0.741415
5 bar two 1.224841 -0.479472
6 foo one 0.680046 -0.476137
7 foo three -1.519952 -0.421738
{('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')}
Int64Index([7], dtype='int64')
{'A': [1, 2, 3], 'B': [2, 3, 4]} <class 'dict'>
#其他轴上分组
df = pd.DataFrame({'data1':np.random.randn(2),
'data2':np.random.randn(2),
'key1':['a','b'],
'key2':['one','two']})
print(df)
print(df.dtypes)
print('--------')
for n,p in df.groupby(df.dtypes,axis=1):
print(n)
print(p)
print('##')
#按照值类型分组,分为2组
结果:
data1 data2 key1 key2
0 0.813374 0.232957 a one
1 -0.213256 1.393156 b two
data1 float64
data2 float64
key1 object
key2 object
dtype: object
--------
float64
data1 data2
0 0.813374 0.232957
1 -0.213256 1.393156
##
object
key1 key2
0 a one
1 b two
##
#通过字典或者Series分组
df = pd.DataFrame(np.arange(16).reshape(4,4),
columns = ['a','b','c','d'])
print(df)
print('-------') mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}
print(mapping)
by_column = df.groupby(mapping,axis = 1)
print(by_column.sum())
print('---------')
#mapping中 a,b列对应为one,c,d列对应为two,以字典为分组 s=pd.Series(mapping)
print(s)
print(s.groupby(s).count())
#s中,index = a,b对应的是one;c,d对应的是two,以Series来分组
结果:
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
-------
{'a': 'one', 'b': 'one', 'c': 'two', 'd': 'two', 'e': 'three'}
one two
0 1 5
1 9 13
2 17 21
3 25 29
---------
a one
b one
c two
d two
e three
dtype: object
one 2
three 1
two 2
dtype: int64
2018.03.28 python-pandas groupby使用的更多相关文章
- 2018.03.27 python pandas merge join 使用
#2.16 合并 merge-join import numpy as np import pandas as pd df1 = pd.DataFrame({'key1':['k0','k1','k2 ...
- python pandas groupby
转自 : https://blog.csdn.net/Leonis_v/article/details/51832916 pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对 ...
- 2018/03/28 每日一个Linux命令 之 mkdir/rmdir
用于建立空文件夹和删除文件夹 -- 两命令重要参数 -p 递归建立/删除 -- 例如 mkdir -p demo1/demo2/demo3 建立demo3空文件夹,如果demo1/demo2没建立也建 ...
- Python pandas快速入门
Python pandas快速入门2017年03月14日 17:17:52 青盏 阅读数:14292 标签: python numpy 数据分析 更多 个人分类: machine learning 来 ...
- 看到篇博文,用python pandas改写了下
看到篇博文,https://blog.csdn.net/young2415/article/details/82795688 需求是需要统计部门礼品数量,自己简单绘制了个表格,如下: 大意是,每个部门 ...
- Python pandas & numpy 笔记
记性不好,多记录些常用的东西,真·持续更新中::先列出一些常用的网址: 参考了的 莫烦python pandas DOC numpy DOC matplotlib 常用 习惯上我们如此导入: impo ...
- python pandas库——pivot使用心得
python pandas库——pivot使用心得 2017年12月14日 17:07:06 阅读数:364 最近在做基于python的数据分析工作,引用第三方数据分析库——pandas(versio ...
- python中groupby函数详解(非常容易懂)
一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...
- http://www.cnblogs.com/youring2/archive/2011/03/28/1997694.html
http://www.cnblogs.com/youring2/archive/2011/03/28/1997694.html
随机推荐
- 关于ARM PC值
PC值(Program Counter). ARM采用流水线来提高CPU的利用效率, 对于三级流水线, 一条汇编指令的执行包括 取值, 译码, 执行三个阶段. 当MOV指令的取指动作完毕后, 进入M ...
- 爬虫笔记八——Scrapy实战项目
(案例一)手机App抓包爬虫 1. items.py import scrapy class DouyuspiderItem(scrapy.Item): # 存储照片的名字 nickName = sc ...
- __name__='main' 这句代码是什么意思?《读书笔记》
当我们阅读 别人的python代码都会有 if name == "main"这么一行语句,但却不知道为什么要写这个?有什么用 想知道这段代码什么意思让我们来根据例子来测试一下 我们 ...
- 查看系统的DPI
#include <Windows.h> #include <iostream> int main() { SetProcessDpiAwarenessContext(DPI_ ...
- 解决 i18n properties文件中文必须是unicode的问题
解决 i18n properties文件中文必须是unicode的问题 i18n unicode UTF-8 目前产品需要做国际化,但 java 的 I18N 资源文件中中文必须转换成 unic ...
- H5手机端开发问题汇总及解决方案
前言 少侠,请留步,相见必是缘分,赠与你一部<踏坑秘籍> 扎马步 踏坑第一式 ios竖屏拍照上传,图片被旋转问题 解决方案 // 几个步骤 // 1.通过第三方插件exif-js获取到图片 ...
- throttle和debounce函数
控制耗性能的函数,避免浏览器卡死
- 【shell】grep使用正则表达式
要求如下: 有一些具有固定格式的数字, 如下: -- ()-- -- (-- 复制代码 条件: .> 长度为7的数字 .> 由 ,, 长度组成, 并由 - 字符进行分割的 .> 第一 ...
- mysql-5.6.45-linux-glibc2.12-x86_64.tar.gz下载安装
一 ,mysql下载 需要注册,可以通过组合url越过注册下载需要的包. 下载地址: https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.3 ...
- layui table 改
F.prototype.pullData = function(e) { success: function (t) { var da001 = i; window.getdata1234567(da ...