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分组的更多相关文章

  1. Pandas分组运算(groupby)修炼

    Pandas分组运算(groupby)修炼 Pandas的groupby()功能很强大,用好了可以方便的解决很多问题,在数据处理以及日常工作中经常能施展拳脚. 今天,我们一起来领略下groupby() ...

  2. pandas分组和聚合

    Pandas分组与聚合 分组 (groupby) 对数据集进行分组,然后对每组进行统计分析 SQL能够对数据进行过滤,分组聚合 pandas能利用groupby进行更加复杂的分组运算 分组运算过程:s ...

  3. pandas分组统计:groupby,melt,pivot_table,crosstab的用法

    groupby: 分组 melt: 宽表转长表 pivot_table: 长表转宽表,数据透视表 crosstab: 交叉表 / 列联表,主要用于分组频数统计 import numpy as np i ...

  4. Python Pandas分组聚合

    Pycharm 鼠标移动到函数上,CTRL+Q可以快速查看文档,CTR+P可以看基本的参数. apply(),applymap()和map() apply()和applymap()是DataFrame ...

  5. Pandas分组级运算和转换

    分组级运算和转换 假设要添加一列的各索引分组平均值 第一种方法 import pandas as pd from pandas import Series import numpy as np df ...

  6. pandas分组group

    Pandas对象可以分成任何对象.有多种方式来拆分对象,如 - obj.groupby(‘key’) obj.groupby([‘key1’,’key2’]) obj.groupby(key,axis ...

  7. Pandas分组统计函数:groupby、pivot_table及crosstab

    利用python的pandas库进行数据分组分析十分便捷,其中应用最多的方法包括:groupby.pivot_table及crosstab,以下分别进行介绍. 0.样例数据 df = DataFram ...

  8. Pandas分组(GroupBy)

    任何分组(groupby)操作都涉及原始对象的以下操作之一.它们是 - 分割对象 应用一个函数 结合的结果 在许多情况下,我们将数据分成多个集合,并在每个子集上应用一些函数.在应用函数中,可以执行以下 ...

  9. Pandas 分组聚合

    # 导入相关库 import numpy as np import pandas as pd 创建数据 index = pd.Index(data=["Tom", "Bo ...

随机推荐

  1. AFN 二次封装

    #import "YQDataManager.h" #import <YYModel/YYModel.h> #pragma mark - 数据model基类 @impl ...

  2. linux基础之bash特性

    linux基础之bash特性 1.命令历史 命令历史包含的环境变量 $HISTSIZE:命令历史记录的条数 $HISTFILE:命令历史文件~/.bash_history $HISTFILESIZE: ...

  3. Java实现带logo的二维码

    Java实现带logo的二维码 二维码应用到生活的各个方面,会用代码实现二维码,我想一定是一项加分的技能.好了,我们来一起实现一下吧. 我们实现的二维码是基于QR Code的标准的,QR Code是由 ...

  4. Parsing with Compositional Vector Grammars--paper

    这篇和2012年的区别: 1)Max-Margin Training Objective J中RNN变为了CVG 2012-两个词向量合并并打分,这个-两个(词向量,POS)合并并打分 2012年: ...

  5. ANSYS耦合

    目录 定义 如何生成耦合自由度集 1.在给定节点处生成并修改耦合自由度集 2.耦合重合节点. 3.迫使节点有相同的表现方式 生成更多的耦合集 1. CPLGEN 2.CPSGEN 使用耦合注意事项 约 ...

  6. pass

    空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++/java中: if(true) ; //do nothing else { //do something } 1 ...

  7. zookeeper的WEB客户端zkui使用

    转载自:http://blog.csdn.net/csolo/article/details/53694665 前面几篇实践说明了zookeeper如何配置和部署,如何开发,因为大多是后台操作,对于维 ...

  8. PostgreSQL获取所有表名、字段名、字段类型、注释

    转载自:http://blog.csdn.net/cicon/article/details/51577655 获取表名及注释: select relname as tabname,cast(obj_ ...

  9. bvlc_reference_caffenet网络权值可视化

    一.网络结构 models/bvlc_reference_caffenet/deploy.prototxt 二.显示conv1的网络权值 clear; clc; close all; addpath( ...

  10. java File处理

    /**************************************************************************************工具类********** ...