Pandas分组
GroupBy技术
分组运算的过程可以用下面的流程图表示出来
import pandas as pd
from pandas import Series
import numpy as np
df = pd.DataFrame({
'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1':np.random.randn(5),
'data2':np.random.randn(5)
})
df
key1 key2 data1 data2
0 a one -0.687740 1.536286
1 a two 0.177156 -1.132658
2 b one 2.024931 0.755856
3 b two -0.304281 -0.629296
4 a one 0.202405 0.911700
# 访问key1调用groupby
grouped = df['data1'].groupby(df['key1'])
# grouped是一个GroupBy对象,它实际上还没有进行任何计算。但是它已经包含了执行分组运算的一切信息
grouped
<pandas.core.groupby.groupby.SeriesGroupBy object at 0x0000020473C51978>
# 例如,算平均值
grouped.mean()
key1
a -0.102726
b 0.860325
Name: data1, dtype: float64
means = df['data1'].groupby([df['key1'],df['key2']]).mean()
means
key1 key2
a one -0.242668
two 0.177156
b one 2.024931
two -0.304281
Name: data1, dtype: float64
# 默认操作的是最内层的
means.unstack()
key2 one two
key1
a -0.242668 0.177156
b 2.024931 -0.304281
# 自定义分组键
states = np.array(['Ohio','California','California','Ohio','Ohio'])
years = np.array([2005,2005,2006,2005,2006])
df['data1'].groupby([states,years]).mean()
California 2005 0.177156
2006 2.024931
Ohio 2005 -0.496010
2006 0.202405
Name: data1, dtype: float64
# 将列名用作分组键
df.groupby('key1').mean()
data1 data2
key1
a -0.102726 0.438443
b 0.860325 0.063280
df.groupby(['key1','key2']).mean()
data1 data2
key1 key2
a one -0.242668 1.223993
two 0.177156 -1.132658
b one 2.024931 0.755856
two -0.304281 -0.629296
# groupby.size方法,返回一个含有分组大小的Series,统计分组的数量
df.groupby(['key1','key2']).size()
key1 key2
a one 2
two 1
b one 1
two 1
dtype: int64
df.groupby('key1').size()
key1
a 3
b 2
dtype: int64
对分组进行迭代
for name,group in df.groupby('key1'):
print(name)
print(group)
a
key1 key2 data1 data2
0 a one -0.687740 1.536286
1 a two 0.177156 -1.132658
4 a one 0.202405 0.911700
b
key1 key2 data1 data2
2 b one 2.024931 0.755856
3 b two -0.304281 -0.629296
# 对于多重键的情况
for k1,group in df.groupby(['key1','key2']):
print(k1)
print(group)
('a', 'one')
key1 key2 data1 data2
0 a one -0.687740 1.536286
4 a one 0.202405 0.911700
('a', 'two')
key1 key2 data1 data2
1 a two 0.177156 -1.132658
('b', 'one')
key1 key2 data1 data2
2 b one 2.024931 0.755856
('b', 'two')
key1 key2 data1 data2
3 b two -0.304281 -0.629296
pieces = dict(list(df.groupby('key1')))
pieces['a']
key1 key2 data1 data2
0 a one -0.687740 1.536286
1 a two 0.177156 -1.132658
4 a one 0.202405 0.911700
# 按数据类型对列尽心分组
df.dtypes
key1 object
key2 object
data1 float64
data2 float64
dtype: object
grouped1 = df.groupby(df.dtypes, axis=1)
dict(list(grouped1))
{dtype('float64'): data1 data2
0 -0.687740 1.536286
1 0.177156 -1.132658
2 2.024931 0.755856
3 -0.304281 -0.629296
4 0.202405 0.911700, dtype('O'): key1 key2
0 a one
1 a two
2 b one
3 b two
4 a one}
选取一个或一个组列
# 分组通常和运算是一起的,只分组,只能是出来一个分组对象
df['data1'].groupby(df['key1'])
<pandas.core.groupby.groupby.SeriesGroupBy object at 0x000002047407C0F0>
df.groupby(['key1','key2'])[['data2']].mean()
data2
key1 key2
a one 1.223993
two -1.132658
b one 0.755856
two -0.629296
通过字典或Series进行分组
people = pd.DataFrame(np.random.randn(5,5),
columns = ['a','b','c','d','e'],
index = ['Joe','Steve','Wes','Jim','Travis']
)
people
a b c d e
Joe -0.721168 -0.332402 -0.512183 0.765475 -0.119330
Steve 0.166230 2.095133 -0.298735 -2.167574 -0.273929
Wes -1.428962 -2.109915 -0.686155 -1.337891 0.020153
Jim 1.041952 0.130567 0.776067 0.508666 0.100419
Travis -0.215110 0.611383 -0.011443 -0.552580 -0.274047
people.ix['Steve':'Wes',['b','c']] = np.nan
people
a b c d e
Joe -0.721168 -0.332402 -0.512183 0.765475 -0.119330
Steve 0.166230 NaN NaN -2.167574 -0.273929
Wes -1.428962 NaN NaN -1.337891 0.020153
Jim 1.041952 0.130567 0.776067 0.508666 0.100419
Travis -0.215110 0.611383 -0.011443 -0.552580 -0.274047
# 根据分组计算列的总计
mapping = {'a':'red','b':'red','c':'blue',
'd':'blue','e':'red','f':'orange'}
by_column = people.groupby(mapping,axis=1).sum()
by_column
blue red
Joe 0.253291 -1.172899
Steve -2.167574 -0.107699
Wes -1.337891 -1.408809
Jim 1.284733 1.272937
Travis -0.564023 0.122226
# 检查映射的对应关系
map_series = Series(mapping)
map_series
a red
b red
c blue
d blue
e red
f orange
dtype: object
people.groupby(map_series,axis=1).count()
blue red
Joe 2 3
Steve 1 2
Wes 1 2
Jim 2 3
Travis 2 3
通过函数进行分组
# 仅仅传入len,就可以实现按名字长度分组
people.groupby(len).sum()
a b c d e
3 -1.108178 -0.201835 0.263884 -0.063751 0.001242
5 0.166230 0.000000 0.000000 -2.167574 -0.273929
6 -0.215110 0.611383 -0.011443 -0.552580 -0.274047
key_list = ['one','one','one','two','two']
people.groupby([len,key_list]).min()
a b c d e
3 one -1.428962 -0.332402 -0.512183 -1.337891 -0.119330
two 1.041952 0.130567 0.776067 0.508666 0.100419
5 one 0.166230 NaN NaN -2.167574 -0.273929
6 two -0.215110 0.611383 -0.011443 -0.552580 -0.274047
根据索引级别分组
columns = pd.MultiIndex.from_arrays([['US','US','US','JP','JP'],[1,3,5,1,3]],names=['cty','tenor'])
hier_df = pd.DataFrame(np.random.randn(4,5),columns=columns)
hier_df
cty US JP
tenor 1 3 5 1 3
0 -0.637036 0.230604 0.425606 0.579673 -0.408535
1 0.987018 -1.313152 -0.322781 -1.393266 -0.393867
2 -2.343672 0.385606 0.992302 -0.791528 -0.774870
3 -0.809241 -0.654219 -0.860250 0.222547 0.049766
hier_df.groupby(level='cty',axis=1).count()
cty JP US
0 2 3
1 2 3
2 2 3
3 2 3
Pandas分组的更多相关文章
- Pandas分组运算(groupby)修炼
Pandas分组运算(groupby)修炼 Pandas的groupby()功能很强大,用好了可以方便的解决很多问题,在数据处理以及日常工作中经常能施展拳脚. 今天,我们一起来领略下groupby() ...
- pandas分组和聚合
Pandas分组与聚合 分组 (groupby) 对数据集进行分组,然后对每组进行统计分析 SQL能够对数据进行过滤,分组聚合 pandas能利用groupby进行更加复杂的分组运算 分组运算过程:s ...
- pandas分组统计:groupby,melt,pivot_table,crosstab的用法
groupby: 分组 melt: 宽表转长表 pivot_table: 长表转宽表,数据透视表 crosstab: 交叉表 / 列联表,主要用于分组频数统计 import numpy as np i ...
- Python Pandas分组聚合
Pycharm 鼠标移动到函数上,CTRL+Q可以快速查看文档,CTR+P可以看基本的参数. apply(),applymap()和map() apply()和applymap()是DataFrame ...
- Pandas分组级运算和转换
分组级运算和转换 假设要添加一列的各索引分组平均值 第一种方法 import pandas as pd from pandas import Series import numpy as np df ...
- pandas分组group
Pandas对象可以分成任何对象.有多种方式来拆分对象,如 - obj.groupby(‘key’) obj.groupby([‘key1’,’key2’]) obj.groupby(key,axis ...
- Pandas分组统计函数:groupby、pivot_table及crosstab
利用python的pandas库进行数据分组分析十分便捷,其中应用最多的方法包括:groupby.pivot_table及crosstab,以下分别进行介绍. 0.样例数据 df = DataFram ...
- Pandas分组(GroupBy)
任何分组(groupby)操作都涉及原始对象的以下操作之一.它们是 - 分割对象 应用一个函数 结合的结果 在许多情况下,我们将数据分成多个集合,并在每个子集上应用一些函数.在应用函数中,可以执行以下 ...
- Pandas 分组聚合
# 导入相关库 import numpy as np import pandas as pd 创建数据 index = pd.Index(data=["Tom", "Bo ...
随机推荐
- mac出现zsh: command not found: ping解决方法
Step1:终端输入以下命令: /sbin/ping 若出现如下信息,说明包含ping命令,是zsh的 PATH有问题,表示没有加载sbin下的命令,需要编辑.zshrc文件. Step2:终端打开. ...
- APPlication,Session和Cookie的区别
方法 信息量大小 保存时间 应用范围 保存位置 Application 任意大小 整个应用程序的生命期 所有用户 服务器端 Session 小量,简单的数据 用户活动时间+一段延迟时间(一般为20分钟 ...
- 关于ajax跨域的一些解决方案
1.JSONP方式解决跨域问题 jsonp解决跨域问题是一个比较古老的方案(实际中不推荐使用),当然,在实际项目中如果要使用JSONP,一般会使用JQ等对JSONP进行了封装的类库来进行ajax请求 ...
- Window系统下搭建GIT本地服务器
转载:https://blog.csdn.net/qwer971211/article/details/71156055
- python------面向对象进阶反射详解(重点)
一.反射 通过字符串映射或者修改程序运行时的状态,属性,或者方法. 1.getattr(object,name,default=None) 2.hasattr(object,name) 3.setat ...
- day 41 标准文档流 浮动
一.标准文档流 什么是标准文档流 宏观的将,我们的web页面和ps等设计软件有本质的区别,web 网页的制作,是个“流”,从上而下 ,像 “织毛衣”.而设计软件 ,想往哪里画东西,就去哪里画 标准文档 ...
- flex 布局压缩问题
在 flex 布局中,当有一个元素宽度过长时,另一个元素宽度会被压缩, 如下图: 解决办法:在不想被压缩的元素上加上样式 flex-shrink: 0; 效果图:
- C#.NET XML报文签名与验签
-- MD5Util: using System; using System.Collections.Generic; using System.Security.Cryptography; usin ...
- 多版本opencv管理; find_package()的原理解析
近期用cmake编译程序时,报错找不到opencv2.由于我电脑里安装了多个版本的opencv,管理不善,借此机会梳理一下思路. 1. Cmake -- find_package(Opencv REQ ...
- 黄聪:visual studio 2017编译运行出现脚本发生错误等问题如何解决?
升级VS2017后,编译运行程序会出现 /Community/Common7/IDE/PrivateAssemblies/plugin.vs.js 错误 先说VS2017-15.6.1跟旧版本IE的兼 ...