Python 数据分析三剑客之 Pandas(六):GroupBy 数据分裂、应用与合并

CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Python:Django实战》、《跟老齐学Python:数据分析》和《Python大学实用教程》畅销图书。


Pandas 系列文章:

  • Python 数据分析三剑客之 Pandas(一):认识 Pandas 及其 Series、DataFrame 对象
  • Python 数据分析三剑客之 Pandas(二):Index 索引对象以及各种索引操作
  • Python 数据分析三剑客之 Pandas(三):算术运算与缺失值的处理
  • Python 数据分析三剑客之 Pandas(四):函数应用、映射、排序和层级索引
  • Python 数据分析三剑客之 Pandas(五):统计计算与统计描述
  • Python 数据分析三剑客之 Pandas(六):GroupBy 数据分裂、应用与合并
  • Python 数据分析三剑客之 Pandas(七):合并数据集
  • Python 数据分析三剑客之 Pandas(八):数据重塑、重复数据处理与数据替换
  • Python 数据分析三剑客之 Pandas(九):时间序列
  • Python 数据分析三剑客之 Pandas(十):数据读写

另有 NumPy、Matplotlib 系列文章已更新完毕,欢迎关注:

  • NumPy 系列文章:https://itrhx.blog.csdn.net/category_9780393.html
  • Matplotlib 系列文章:https://itrhx.blog.csdn.net/category_9780418.html

推荐学习资料与网站(博主参与部分文档翻译):

  • NumPy 官方中文网:https://www.numpy.org.cn/
  • Pandas 官方中文网:https://www.pypandas.cn/
  • Matplotlib 官方中文网:https://www.matplotlib.org.cn/
  • NumPy、Matplotlib、Pandas 速查表:https://github.com/TRHX/Python-quick-reference-table

文章目录

    • 【01x00】GroupBy 机制
    • 【02x00】GroupBy 对象
    • 【03x00】GroupBy Split 数据分裂
      • 【03x01】分组运算
      • 【03x02】按类型按列分组
      • 【03x03】自定义分组
        • 【03x03x01】字典分组
        • 【03x03x02】函数分组
        • 【03x03x03】索引层级分组
      • 【03x04】分组迭代
      • 【03x05】对象转换
    • 【04x00】GroupBy Apply 数据应用
      • 【04x01】聚合函数
      • 【04x02】自定义函数
      • 【04x03】对不同列作用不同函数
      • 【04x04】GroupBy.apply()


这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/106804881
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!

【01x00】GroupBy 机制

对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就是计算分组统计或生成透视表。Pandas 提供了一个灵活高效的 GroupBy 功能,虽然“分组”(group by)这个名字是借用 SQL 数据库语言的命令,但其理念引用发明 R 语言 frame 的 Hadley Wickham 的观点可能更合适:分裂(Split)、应用(Apply)和组合(Combine)。

分组运算过程:Split —> Apply —> Combine

  • 分裂(Split):根据某些标准将数据分组;
  • 应用(Apply):对每个组独立应用一个函数;
  • 合并(Combine):把每个分组的计算结果合并起来。

官方介绍:https://pandas.pydata.org/docs/user_guide/groupby.html

01

【02x00】GroupBy 对象

常见的 GroupBy 对象:Series.groupby、DataFrame.groupby,基本语法如下:

Series.groupby(self,by=None,axis=0,level=None,as_index: bool = True,sort: bool = True,group_keys: bool = True,squeeze: bool = False,observed: bool = False) → ’groupby_generic.SeriesGroupBy’
DataFrame.groupby(self,by=None,axis=0,level=None,as_index: bool = True,sort: bool = True,group_keys: bool = True,squeeze: bool = False,observed: bool = False) → ’groupby_generic.DataFrameGroupBy’

官方文档:

  • https://pandas.pydata.org/docs/reference/api/pandas.Series.groupby.html

  • https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html

常用参数解释如下:

参数描述
by映射、函数、标签或标签列表,用于确定分组依据的分组。如果 by 是函数,则会在对象索引的每个值上调用它。
如果传递了 dict 或 Series,则将使用 Series 或 dict 的值来确定组(将 Series 的值首先对齐;请参见.align() 方法)。
如果传递了 ndarray,则按原样使用这些值来确定组。标签或标签列表可以按自身中的列传递给分组。 注意,元组被解释为(单个)键
axis沿指定轴拆分,默认 00 or ‘index’1 or ‘columns’,只有在 DataFrame 中才有 1 or 'columns’
level如果轴是 MultiIndex(层次结构),则按特定层级进行分组,默认 None
as_indexbool 类型,默认 True,对于聚合输出,返回以组标签为索引的对象。仅与 DataFrame 输入相关。
as_index=False 实际上是“SQL样式”分组输出
sortbool 类型,默认 True,对组键排序。关闭此选项可获得更好的性能。注:这不影响每组的观察顺序。Groupby 保留每个组中行的顺序
group_keysbool 类型,默认 True,调用 apply 方法时,是否将组键(keys)添加到索引( index)以标识块
squeezebool 类型,默认 False,如果可能,减少返回类型的维度,否则返回一致的类型

groupby() 进行分组,GroupBy 对象没有进行实际运算,只是包含分组的中间数据,示例如下:

>>> import pandas as pd
>>> import numpy as np
>>> data = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randn(8),'data2': np.random.randn(8)}
>>> 
>>> obj = pd.DataFrame(data)
>>> objkey1   key2     data1     data2
0    a    one -0.804160 -0.868905
1    b    one -0.086990  0.325741
2    a    two  0.757992  0.541101
3    b  three -0.281435  0.097841
4    a    two  0.817757 -0.643699
5    b    two -0.462760 -0.321196
6    a    one -0.403699  0.602138
7    a  three  0.883940 -0.850526
>>> 
>>> obj.groupby('key1')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x03CDB7C0>
>>> 
>>> obj['data1'].groupby(obj['key1'])
<pandas.core.groupby.generic.SeriesGroupBy object at 0x03CDB748>

【03x00】GroupBy Split 数据分裂

【03x01】分组运算

前面通过 groupby() 方法获得了一个 GroupBy 对象,它实际上还没有进行任何计算,只是含有一些有关分组键 obj['key1'] 的中间数据而已。换句话说,该对象已经有了接下来对各分组执行运算所需的一切信息。例如,我们可以调用 GroupBy 的 mean() 方法来计算分组平均值,size() 方法返回每个分组的元素个数:

>>> import pandas as pd
>>> import numpy as np
>>> data = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randn(8),'data2': np.random.randn(8)}
>>> 
>>> obj = pd.DataFrame(data)
>>> objkey1   key2     data1     data2
0    a    one -0.544099 -0.614079
1    b    one  2.193712  0.101005
2    a    two -0.004683  0.882770
3    b  three  0.312858  1.732105
4    a    two  0.011089  0.089587
5    b    two  0.292165  1.327638
6    a    one -1.433291 -0.238971
7    a  three -0.004724 -2.117326
>>> 
>>> grouped1 = obj.groupby('key1')
>>> grouped2 = obj['data1'].groupby(obj['key1'])
>>> 
>>> grouped1.mean()data1     data2
key1                    
a    -0.395142 -0.399604
b     0.932912  1.053583
>>> 
>>> grouped2.mean()
key1
a   -0.395142
b    0.932912
Name: data1, dtype: float64
>>>
>>> grouped1.size()
key1
a    5
b    3
dtype: int64
>>> 
>>> grouped2.size()
key1
a    5
b    3
Name: data1, dtype: int64

【03x02】按类型按列分组

groupby() 方法 axis 参数默认是 0,通过设置也可以在其他任何轴上进行分组,也支持按照类型(dtype)进行分组:

>>> import pandas as pd
>>> import numpy as np
>>> data = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randn(8),'data2': np.random.randn(8)}
>>> obj = pd.DataFrame(data)
>>> objkey1   key2     data1     data2
0    a    one -0.607009  1.948301
1    b    one  0.150818 -0.025095
2    a    two -2.086024  0.358164
3    b  three  0.446061  1.708797
4    a    two  0.745457 -0.980948
5    b    two  0.981877  2.159327
6    a    one  0.804480 -0.499661
7    a  three  0.112884  0.004367
>>> 
>>> obj.dtypes
key1      object
key2      object
data1    float64
data2    float64
dtype: object
>>> 
>>> obj.groupby(obj.dtypes, axis=1).size()
float64    2
object     2
dtype: int64
>>> 
>>> obj.groupby(obj.dtypes, axis=1).sum()float64  object
0  1.341291    aone
1  0.125723    bone
2 -1.727860    atwo
3  2.154858  bthree
4 -0.235491    atwo
5  3.141203    btwo
6  0.304819    aone
7  0.117251  athree

【03x03】自定义分组

groupby() 方法中可以一次传入多个数组的列表,也可以自定义一组分组键。也可以通过一个字典、一个函数,或者按照索引层级进行分组。

传入多个数组的列表:

>>> import pandas as pd
>>> import numpy as np
>>> data = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randn(8),'data2': np.random.randn(8)}
>>> obj = pd.DataFrame(data)
>>> objkey1   key2     data1     data2
0    a    one -0.841652  0.688055
1    b    one  0.510042 -0.561171
2    a    two -0.418862 -0.145983
3    b  three -1.104698  0.563158
4    a    two  0.329527 -0.893108
5    b    two  0.753653 -0.342520
6    a    one -0.882527 -1.121329
7    a  three  1.726794  0.160244
>>> 
>>> means = obj['data1'].groupby([obj['key1'], obj['key2']]).mean()
>>> means
key1  key2 
a     one     -0.862090three    1.726794two     -0.044667
b     one      0.510042three   -1.104698two      0.753653
Name: data1, dtype: float64
>>> 
>>> means.unstack()
key2       one     three       two
key1                              
a    -0.862090  1.726794 -0.044667
b     0.510042 -1.104698  0.753653

自定义分组键:

>>> import pandas as pd
>>> import numpy as np
>>> obj = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],'key2' : ['one', 'two', 'one', 'two', 'one'],'data1' : np.random.randn(5),'data2' : np.random.randn(5)})
>>> objkey1 key2     data1     data2
0    a  one -0.024003  0.350480
1    a  two -0.767534 -0.100426
2    b  one -0.594983 -1.945580
3    b  two -0.374482  0.817592
4    a  one  0.755452 -0.137759
>>> 
>>> states = np.array(['Wuhan', 'Beijing', 'Beijing', 'Wuhan', 'Wuhan'])
>>> years = np.array([2005, 2005, 2006, 2005, 2006])
>>> 
>>> obj['data1'].groupby([states, years]).mean()
Beijing  2005   -0.7675342006   -0.594983
Wuhan    2005   -0.1992422006    0.755452
Name: data1, dtype: float64

【03x03x01】字典分组

通过字典进行分组:

>>> import pandas as pd
>>> import numpy as np
>>> obj = pd.DataFrame(np.random.randint(1, 10, (5,5)),columns=['a', 'b', 'c', 'd', 'e'],index=['A', 'B', 'C', 'D', 'E'])
>>> obja  b  c  d  e
A  1  4  7  1  9
B  8  2  4  7  8
C  9  8  2  5  1
D  2  4  2  8  3
E  7  5  7  2  3
>>> 
>>> obj_dict = {'a':'Python', 'b':'Python', 'c':'Java', 'd':'C++', 'e':'Java'}
>>> obj.groupby(obj_dict, axis=1).size()
C++       1
Java      2
Python    2
dtype: int64
>>> 
>>> obj.groupby(obj_dict, axis=1).count()C++  Java  Python
A    1     2       2
B    1     2       2
C    1     2       2
D    1     2       2
E    1     2       2
>>> 
>>> obj.groupby(obj_dict, axis=1).sum()C++  Java  Python
A    1    16       5
B    7    12      10
C    5     3      17
D    8     5       6
E    2    10      12

【03x03x02】函数分组

通过函数进行分组:

>>> import pandas as pd
>>> import numpy as np
>>> obj = pd.DataFrame(np.random.randint(1, 10, (5,5)),columns=['a', 'b', 'c', 'd', 'e'],index=['AA', 'BBB', 'CC', 'D', 'EE'])
>>> obja  b  c  d  e
AA   3  9  5  8  2
BBB  1  4  2  2  6
CC   9  2  4  7  6
D    2  5  5  7  1
EE   8  8  8  2  2
>>> 
>>> def group_key(idx):"""idx 为列索引或行索引"""return len(idx)>>> obj.groupby(group_key).size()    # 等价于 obj.groupby(len).size()
1    1
2    3
3    1
dtype: int64

【03x03x03】索引层级分组

通过不同索引层级进行分组:

>>> import pandas as pd
>>> import numpy as np
>>> columns = pd.MultiIndex.from_arrays([['Python', 'Java', 'Python', 'Java', 'Python'],['A', 'A', 'B', 'C', 'B']], names=['language', 'index'])
>>> obj = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
>>> obj
language Python Java Python Java Python
index         A    A      B    C      B
0             7    1      9    8      5
1             4    5      4    5      6
2             4    3      1    9      5
3             6    6      3    8      1
4             7    9      2    8      2
>>> 
>>> obj.groupby(level='language', axis=1).sum()
language  Java  Python
0            9      21
1           10      14
2           12      10
3           14      10
4           17      11
>>> 
>>> obj.groupby(level='index', axis=1).sum()
index   A   B  C
0       8  14  8
1       9  10  5
2       7   6  9
3      12   4  8
4      16   4  8

【03x04】分组迭代

GroupBy 对象支持迭代,对于单层分组,可以产生一组二元元组,由分组名和数据块组成:

>>> import pandas as pd
>>> import numpy as np
>>> data = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randn(8),'data2': np.random.randn(8)}
>>> obj = pd.DataFrame(data)
>>> objkey1   key2     data1     data2
0    a    one -1.088762  0.668504
1    b    one  0.275500  0.787844
2    a    two -0.108417 -0.491296
3    b  three  0.019524 -0.363390
4    a    two  0.453612  0.796999
5    b    two  1.982858  1.501877
6    a    one  1.101132 -1.928362
7    a  three  0.524775 -1.205842
>>> 
>>> for group_name, group_data in obj.groupby('key1'):print(group_name)print(group_data)akey1   key2     data1     data2
0    a    one -1.088762  0.668504
2    a    two -0.108417 -0.491296
4    a    two  0.453612  0.796999
6    a    one  1.101132 -1.928362
7    a  three  0.524775 -1.205842
bkey1   key2     data1     data2
1    b    one  0.275500  0.787844
3    b  three  0.019524 -0.363390
5    b    two  1.982858  1.501877

对于多层分组,元组的第一个元素将会是由键值组成的元组,第二个元素为数据块:

>>> import pandas as pd
>>> import numpy as np
>>> data = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randn(8),'data2': np.random.randn(8)}
>>> obj = pd.DataFrame(data)
>>> objkey1   key2     data1     data2
0    a    one -1.088762  0.668504
1    b    one  0.275500  0.787844
2    a    two -0.108417 -0.491296
3    b  three  0.019524 -0.363390
4    a    two  0.453612  0.796999
5    b    two  1.982858  1.501877
6    a    one  1.101132 -1.928362
7    a  three  0.524775 -1.205842
>>> 
>>> for group_name, group_data in obj.groupby(['key1', 'key2']):print(group_name)print(group_data)('a', 'one')key1 key2     data1     data2
0    a  one -1.088762  0.668504
6    a  one  1.101132 -1.928362
('a', 'three')key1   key2     data1     data2
7    a  three  0.524775 -1.205842
('a', 'two')key1 key2     data1     data2
2    a  two -0.108417 -0.491296
4    a  two  0.453612  0.796999
('b', 'one')key1 key2   data1     data2
1    b  one  0.2755  0.787844
('b', 'three')key1   key2     data1    data2
3    b  three  0.019524 -0.36339
('b', 'two')key1 key2     data1     data2
5    b  two  1.982858  1.501877

【03x05】对象转换

GroupBy 对象支持转换成列表或字典:

>>> import pandas as pd
>>> import numpy as np
>>> data = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randn(8),'data2': np.random.randn(8)}
>>> obj = pd.DataFrame(data)
>>> objkey1   key2     data1     data2
0    a    one -0.607009  1.948301
1    b    one  0.150818 -0.025095
2    a    two -2.086024  0.358164
3    b  three  0.446061  1.708797
4    a    two  0.745457 -0.980948
5    b    two  0.981877  2.159327
6    a    one  0.804480 -0.499661
7    a  three  0.112884  0.004367
>>> 
>>> grouped = obj.groupby('key1')
>>> list(grouped)
[('a',   key1   key2     data1     data2
0    a    one -0.607009  1.948301
2    a    two -2.086024  0.358164
4    a    two  0.745457 -0.980948
6    a    one  0.804480 -0.499661
7    a  three  0.112884  0.004367),
('b',   key1   key2     data1     data2
1    b    one  0.150818 -0.025095
3    b  three  0.446061  1.708797
5    b    two  0.981877  2.159327)]
>>> 
>>> dict(list(grouped))
{'a':   key1   key2     data1     data2
0    a    one -0.607009  1.948301
2    a    two -2.086024  0.358164
4    a    two  0.745457 -0.980948
6    a    one  0.804480 -0.499661
7    a  three  0.112884  0.004367,
'b':   key1   key2     data1     data2
1    b    one  0.150818 -0.025095
3    b  three  0.446061  1.708797
5    b    two  0.981877  2.159327}

【04x00】GroupBy Apply 数据应用

聚合指的是任何能够从数组产生标量值的数据转换过程,常用于对分组后的数据进行计算

【04x01】聚合函数

之前的例子已经用过一些内置的聚合函数,比如 mean、count、min 以及 sum 等。常见的聚合运算如下表所示:

官方文档:https://pandas.pydata.org/docs/reference/groupby.html

方法描述
count非NA值的数量
describe针对Series或各DataFrame列计算汇总统计
min计算最小值
max计算最大值
argmin计算能够获取到最小值的索引位置(整数)
argmax计算能够获取到最大值的索引位置(整数)
idxmin计算能够获取到最小值的索引值
idxmax计算能够获取到最大值的索引值
quantile计算样本的分位数(0到1)
sum值的总和
mean值的平均数
median值的算术中位数(50%分位数)
mad根据平均值计算平均绝对离差
var样本值的方差
std样本值的标准差

应用示例:

>>> import pandas as pd
>>> import numpy as np
>>> obj = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randint(1,10, 8),'data2': np.random.randint(1,10, 8)}
>>> obj = pd.DataFrame(obj)
>>> objkey1   key2  data1  data2
0    a    one      9      7
1    b    one      5      9
2    a    two      2      4
3    b  three      3      4
4    a    two      5      1
5    b    two      5      9
6    a    one      1      8
7    a  three      2      4
>>> 
>>> obj.groupby('key1').sum()data1  data2
key1              
a        19     24
b        13     22
>>> 
>>> obj.groupby('key1').max()key2  data1  data2
key1                   
a     two      9      8
b     two      5      9
>>> 
>>> obj.groupby('key1').min()key2  data1  data2
key1                   
a     one      1      1
b     one      3      4
>>> 
>>> obj.groupby('key1').mean()data1     data2
key1                    
a     3.800000  4.800000
b     4.333333  7.333333
>>> 
>>> obj.groupby('key1').size()
key1
a    5
b    3
dtype: int64
>>> 
>>> obj.groupby('key1').count()key2  data1  data2
key1                    
a        5      5      5
b        3      3      3
>>> 
>>> obj.groupby('key1').describe()data1                                ... data2                    count      mean       std  min  25%  ...   min  25%  50%  75%  max
key1                                      ...                          
a      5.0  3.800000  3.271085  1.0  2.0  ...   1.0  4.0  4.0  7.0  8.0
b      3.0  4.333333  1.154701  3.0  4.0  ...   4.0  6.5  9.0  9.0  9.0[2 rows x 16 columns]

【04x02】自定义函数

如果自带的内置函数满足不了我们的要求,则可以自定义一个聚合函数,然后传入 GroupBy.agg(func)GroupBy.aggregate(func) 方法中即可。func 的参数为 groupby 索引对应的记录。

>>> import pandas as pd
>>> import numpy as np
>>> obj = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randint(1,10, 8),'data2': np.random.randint(1,10, 8)}
>>> obj = pd.DataFrame(obj)
>>> objkey1   key2  data1  data2
0    a    one      9      7
1    b    one      5      9
2    a    two      2      4
3    b  three      3      4
4    a    two      5      1
5    b    two      5      9
6    a    one      1      8
7    a  three      2      4
>>> 
>>> def peak_range(df):return df.max() - df.min()>>> 
>>> obj.groupby('key1').agg(peak_range)data1  data2
key1              
a         8      7
b         2      5
>>> 
>>> obj.groupby('key1').agg(lambda df : df.max() - df.min())data1  data2
key1              
a         8      7
b         2      5

【04x03】对不同列作用不同函数

使用字典可以对不同列作用不同的聚合函数:

>>> import pandas as pd
>>> import numpy as np
>>> obj = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randint(1,10, 8),'data2': np.random.randint(1,10, 8)}
>>> obj = pd.DataFrame(obj)
>>> objkey1   key2  data1  data2
0    a    one      9      7
1    b    one      5      9
2    a    two      2      4
3    b  three      3      4
4    a    two      5      1
5    b    two      5      9
6    a    one      1      8
7    a  three      2      4
>>> 
>>> dict1 = {'data1':'mean', 'data2':'sum'}
>>> dict2 = {'data1':['mean','max'], 'data2':'sum'}
>>> 
>>> obj.groupby('key1').agg(dict1)data1  data2
key1                 
a     3.800000     24
b     4.333333     22
>>> 
>>> obj.groupby('key1').agg(dict2)data1     data2mean max   sum
key1                    
a     3.800000   9    24
b     4.333333   5    22

【04x04】GroupBy.apply()

apply() 方法会将待处理的对象拆分成多个片段,然后对各片段调用传入的函数,最后尝试将各片段组合到一起。

>>> import pandas as pd
>>> obj = pd.DataFrame({'A':['bob','sos','bob','sos','bob','sos','bob','bob'],'B':['one','one','two','three','two','two','one','three'],'C':[3,1,4,1,5,9,2,6],'D':[1,2,3,4,5,6,7,8]})
>>> objA      B  C  D
0  bob    one  3  1
1  sos    one  1  2
2  bob    two  4  3
3  sos  three  1  4
4  bob    two  5  5
5  sos    two  9  6
6  bob    one  2  7
7  bob  three  6  8
>>> 
>>> grouped = obj.groupby('A')
>>> for name, group in grouped:print(name)print(group)bobA      B  C  D
0  bob    one  3  1
2  bob    two  4  3
4  bob    two  5  5
6  bob    one  2  7
7  bob  three  6  8
sosA      B  C  D
1  sos    one  1  2
3  sos  three  1  4
5  sos    two  9  6
>>> 
>>> grouped.apply(lambda x:x.describe())  # 对 bob 和 sos 两组数据使用 describe 方法C         D
A                            
bob count  5.000000  5.000000mean   4.000000  4.800000std    1.581139  2.863564min    2.000000  1.00000025%    3.000000  3.00000050%    4.000000  5.00000075%    5.000000  7.000000max    6.000000  8.000000
sos count  3.000000  3.000000mean   3.666667  4.000000std    4.618802  2.000000min    1.000000  2.00000025%    1.000000  3.00000050%    1.000000  4.00000075%    5.000000  5.000000max    9.000000  6.000000
>>>
>>> grouped.apply(lambda x:x.min())  # # 对 bob 和 sos 两组数据使用 min 方法A    B  C  D
A                  
bob  bob  one  2  1
sos  sos  one  1  2

这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/106804881
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

错误: 找不到或无法加载主类 org.apache.flume.tools.GetJavaProperty

打开bin下的flume-ng 找到下面&#xff0c;添加红色框内容&#xff0c;即可 如果还有有关hbase的同样的错误&#xff08;因为hadoop与hbase版本不兼容&#xff0c;更换我这里hadoop-2.7.7&#xff0c;hbase-2.0.6&#xff08;一开始是2.1.5会出现这个错误&#xff09;&#xff…

flume学习-含安装

1.Flume是什么&#xff1a;Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 Flume组成架构 下面我们来详细介绍一下Flume架构中的组件。 1&#xff09; Agent&#xff1…

【转】使用Azure Rest API获得Access Token介绍

1. 前言 本文主要描述了以java应用为客户端&#xff0c;使用Azure Rest接口的认证过程&#xff0c;帮助快速完成使用Azure Rest接口的第一步。 2. 读者 本文适合开发人员、IT运维人员阅读。 3. 方案架构说明 在我负责的某大型国企客户提出的混合云战略是&#xff1a;不仅要…

Flume-ng 高可用搭建-与测试

前提&#xff1a; 1)五台虚拟机&#xff08;三台也可以&#xff09; 2)flume单节点测试并学会 3)hadoop集群搭建完成 Flume NG集群&#xff0c;架构图 Flume的存储可以支持多种&#xff0c;这里只列举了HDFS 角色分配 名称HOST角色Agent1chun1Web ServerAgent2chun2Web Ser…

【转】D365 FO第三方集成(一)---访问认证(应用注册)

从Axapta3.0的COM Business Connector&#xff0c;到AX4.0和AX2009的 .NET Business Connector&#xff0c;到AX2012的WCF Services&#xff0c;最后到D365FO的接口方式。 AX的接口演化&#xff0c;几乎见证了微软整个技术栈的变迁。 D365 FO的Web Services比起AX2012有了飞跃&…

【转】Postman系列一:Postman安装及使用过程中遇到的问题

一&#xff1a;Postman的简介、下载安装及界面说明 1.Postman的简单介绍 Postman是一款强大的网页调试和发送网页HTTP请求的工具&#xff0c;Postman让开发和测试人员做API&#xff08;接口&#xff09;测试变得更加简单。在我使用Postman之前还有一个版本&#xff0c;就是需要…

Python 数据分析三剑客之 Pandas(十):数据读写

CSDN 课程推荐&#xff1a;《迈向数据科学家&#xff1a;带你玩转Python数据分析》&#xff0c;讲师齐伟&#xff0c;苏州研途教育科技有限公司CTO&#xff0c;苏州大学应用统计专业硕士生指导委员会委员&#xff1b;已出版《跟老齐学Python&#xff1a;轻松入门》《跟老齐学Py…

COVID-19 肺炎疫情数据实时监控(python 爬虫 + pyecharts 数据可视化 + wordcloud 词云图)

文章目录【1x00】前言【2x00】思维导图【3x00】数据结构分析【4x00】主函数 main()【5x00】数据获取模块 data_get【5x01】初始化函数 init()【5x02】中国总数据 china_total_data()【5x03】全球总数据 global_total_data()【5x04】中国每日数据 china_daily_data()【5x05】境外…

【转】Postman系列二:Postman中get接口实战讲解(接口测试介绍,接口测试流程,头域操作)

一&#xff1a;接口测试介绍 接口测试&#xff1a;就是针对软件对外提供服务的接口输入输出进行测试&#xff0c;以及接口间相互逻辑的测试&#xff0c;验证接口功能和接口描述文档的一致性。 接口测试好处&#xff1a;接口测试通常能对系统测试的更为彻底&#xff0c;更高的保…

Python3 爬虫实战 — 前程无忧招聘信息爬取 + 数据可视化

爬取时间&#xff1a;2020-07-11&#xff08;2020年10月测试&#xff0c;增加了反爬&#xff0c;此代码已失效&#xff01;&#xff01;&#xff01;&#xff09;实现目标&#xff1a;根据用户输入的关键字爬取相关职位信息存入 MongoDB&#xff0c;读取数据进行可视化展示。涉…

【转】Postman系列三:Postman中post接口实战(上传文件、json请求)

一&#xff1a;接口测试过程中GET请求与POST请求的主要区别 从开发角度我们看get与post的主要区别是&#xff1a; 1.Get是用来从服务器上获得数据&#xff0c;而Post是用来向服务器上传递数据&#xff1b; 2.Get安全性比Post低&#xff1a;Get将表单中数据的按照keyvalue的形式…

Hadoop datanode正常启动,但是jps差不多datanode进程,而且Live nodes中却缺少节点

启动时可以看到启动成功&#xff0c;但是在chun2&#xff0c;jps的时候却没有了datanode进程&#xff0c;而且web端Live nodes也缺少了 百度搜索之后查到是因为hdfs.site.xml配置文件里dfs.data.dir配置的路径重复&#xff0c;就是多个节点存放data数据的目录路径相同了&#x…

【转】Postman系列四:Postman接口请求设置环境变量和全局变量、测试沙箱和测试断言、测试集运行与导入数据文件

一&#xff1a;Postman中接口请求设置环境变量和全局变量 全局变量和环境变量可以通过Pre-request Script和Tests设置&#xff0c;会在下面测试沙箱和测试断言中讲到。 全局变量的设置&#xff1a;官网参考https://learning.getpostman.com/docs/postman/environments_and_glob…

Python 算法之递归与尾递归,斐波那契数列以及汉诺塔的实现

文章目录递归概念递归要素递归与迭代的区别示例一&#xff1a;阶乘示例二&#xff1a;斐波那契数列示例三&#xff1a;汉诺塔问题尾递归Python 中尾递归的解决方案递归概念 递归&#xff1a;程序调用自身的编程技巧称为递归&#xff08; recursion&#xff09;。用一种通俗的话…

【转】Postman系列五:Postman中电商网站cookie、token检验与参数传递实战

一&#xff1a;Postman中电商网站cookie实战 Postman接口请求使用cookie两种方式&#xff1a; 1.直接在header&#xff08;头域&#xff09;中添加cookie&#xff0c;适用于已知请求cookie头域的情况 2.使用Postman的cookie管理机制&#xff0c;即可以手动添加&#xff0c;同时…

Python 数据结构之栈的实现

文章目录栈的概念栈的特点栈的操作Python 实现栈栈的简单应用&#xff1a;括号匹配问题栈的简单应用&#xff1a;倒序输出一组元素栈的概念 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;栈是一种线性数据结构&#xff0c;用先进后出或者是后进先出的方式存储数据&…

CSDN 2020 博客之星实时数据排名(Python 爬虫 + PyEcharts)

CSDN 2020 博客之星实时数据排名&#xff1a;csdn.itrhx.com CSDN 一年一度的博客之星评选开始了&#xff0c;官网地址&#xff1a;https://bss.csdn.net/m/topic/blog_star2020 &#xff0c;由于官网是按照随机编号排序的&#xff0c;没有按照票数多少排序&#xff0c;为了方便…

【转】注册Azure AD 应用程序

作者&#xff1a;陈希章 发表于2017年3月22日 在此前的文章中&#xff0c;我给大家介绍了分别用Graph 浏览器以及第三方工具&#xff08;POSTMAN&#xff09;快速体验Microsoft Graph的功能&#xff0c;其中有一个重要的环节就是&#xff0c;开发人员需要访问Microsoft Graph的…

Python + GitHub Actions 实现 CSDN 自动签到与抽奖(非 selenium 版本)

文章目录【1x00】技术栈【2x00】代码实现签到与抽奖【3x00】签到结果通知【03x01】Server 酱【03x02】企业微信【03x03】钉钉【4x00】自动签到【5x00】完整代码【6x00】如何使用【06x01】方法一&#xff1a;直接 Fork 代码&#xff08;推荐&#xff09;【06x01】方法二&#xf…

Spark安装配置

Scala基础语法学习的差不多了&#xff0c;先把spark安装上 首先官网下载解压安装后 进入到conf目录下修改文件名 修改spark-env.sh&#xff08;配置jdk路径&#xff09; export JAVA_HOME/usr/local/java/jdk1.8.0_221修改slaves&#xff08;添加子节点名&#xff09; chun…