pandas聚合分组的具体使用

 更新时间:2024年03月17日 16:30:15   作者:金灰  
使用数据库时,我们利用查询操作对各列或各行中的数据进行分组,可以针对其中的每一组数据进行各种不同的操作,本文主要介绍了pandas聚合分组,感兴趣的可以了解一下

1.分组操作

数据的分组与聚合是关系型数据库中比较常见术语。

使用数据库时,我们利用查询操作对各列或各行中的数据进行分组,可以针对其中的每一组数据进行各种不同的操作。

1.1 分组步骤

在数据分析中,经常会遇到这样的情况:根据某一列(或多列)标签把数据划分为不同的组别,然后再对其进行数据分析。

比如,某网站对注册用户的性别或者年龄等进行分组,从而研究出网站用户的画像(特点)。

在 Pandas 中,要完成数据的分组操作,需要使用 groupby() 函数,它和 SQL 的GROUP BY操作非常相似 .

在划分出来的组(group)上应用一些统计函数,从而达到数据分析的目的,比如对分组数据进行聚合、转换,或者过滤。这个过程主要包含以下三步:

  • 拆分(Spliting):表示对数据进行分组;

  • 应用(Applying):对分组数据应用聚合函数,进行相应计算;

  • 合并(Combining):最后汇总计算结果。

1.2 基本使用

演示代码:

import pandas as pd
import numpy as np
​
company = ["A","B","C"]
df_data= pd.DataFrame({
    "company":[company[x] for x in np.random.randint(0,len(company),10)],
    "salary":np.random.randint(5,50,10),
    "age":np.random.randint(15,50,10)
})
print(df_data)
--------------------------
 company  salary  age
0       A      29   16
1       C      21   23
2       A      15   24
3       A      45   47
4       A      45   41
5       C      46   39
6       B      24   24
7       A      21   18
8       B      33   37
9       C      30   18
​

在pandas中,实现分组操作的代码很简单,仅需一行代码,在这里,将上面的数据集按照字段进行划分:

group = df_data.groupby("company")
group
​
# 生成DataFrameGroupBy对象
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000250E4329EA0>
​
----------
# 转换为列表,则更加直观地看出效果
list(group)
[('A',
    company  salary  age
  1       A      48   47
  3       A      30   29),
 ('B',
    company  salary  age
  0       B      30   21
  2       B      25   44
  4       B      49   18
  5       B      24   19
  7       B      11   37),
 ('C',
    company  salary  age
  6       C      35   42
  8       C       6   26
  9       C      24   45)]

groupby的过程就是将原有的DataFrame按照groupby的字段(这里是company),划分为若干个分组DataFrame

1.3 分组聚合

聚合操作是groupby后非常常见的操作,聚合操作可以用来求和、均值、最大值、最小值等.

--分组后的操作.

函数作用
max最大值
min最小值
sum求和
mean求平均值
median中位数
std标准差
var方差
count计数
# 按照company进行分组,然后求平均值
df_data.groupby("company").agg("mean")
---------
 salary        age
company                      
A        42.000000  40.000000
B        35.333333  36.666667
C        16.666667  25.666667
...

1.4 实操(练习)

import pandas as pd
import numpy as np
​
country = ["中国","美国","英国"]
data = {
    "country": [country[x] for x in np.random.randint(0,len(country),10)],
    "year": np.random.randint(1990, 2000, size=10),
    "GDP": np.random.randint(25000,30000,size=10)
}
df_data = pd.DataFrame(data)
print(df_data)
-------------------
  country  year    GDP
0      英国  1996  28767
1      中国  1991  25541
2      英国  1996  28251
3      美国  1992  29543
4      中国  1998  28031
5      英国  1993  28510
6      美国  1996  27576
7      美国  1993  27087
8      美国  1998  28345
9      英国  1999  27247

1-创建groupby分组对象

使用 groupby() 可以沿着任意轴分组。您可以把分组时指定的键(key)作为每组的组名.

df_data.groupby('year')
#返回对象地址.

2-查看分组结果

通过调用groups属性查看分组结果.

print(df_data.groupby('year').groups)
#{1990: [2, 4], 1992: [0, 7], 1994: [8], 1995: [5], 1997: [3], 1998: [1, 6, 9]}

3--演练操作

# 计算每一年的GDP和year的平均值
df_data.groupby("year")[["GDP", "year"]].mean()
----------------------
          GDP    year
year                 
1990  29592.0  1990.0
1992  27173.5  1992.0
1993  28316.0  1993.0
1994  29401.0  1994.0
1997  26791.0  1997.0
1998  29947.0  1998.0
1999  28290.0  1999.0
​
​
# 计算每个国家GDP的平均值和收入的中位数
df_data.groupby("country").agg({"GDP":"mean","year":"median"})
------------------------
             GDP    year
country                 
中国       27256.0  1998.0
美国       27220.0  1993.0
英国       26834.0  1993.0
​
​
​
# 计算每个国家每年的GDP和year的平均值和方差
df_data.groupby("country")[["GDP", "year"]].agg(["mean","std"])
-------------------------------------------------------------
                  GDP                      year          
                 mean          std         mean       std
country                                                  
中国       27922.285714   727.771419  1994.571429  3.309438
美国       27824.000000  2332.038164  1996.000000  0.000000
英国       26188.000000          NaN  1994.000000       NaN
​
​
​
# 计算每一年,中国和美国的GDP和year的平均值
df_data.groupby(["year", "country"])[["GDP", "year"]].mean()
-----------------------------------------------------
                  GDP    year
year country                 
1990 美国       27325.5  1990.0
     英国       28920.0  1990.0
1991 美国       28691.0  1991.0
     英国       26217.0  1991.0
1992 中国       26445.0  1992.0
1995 美国       28058.0  1995.0
1996 英国       25210.0  1996.0
1999 美国       26850.0  1999.0
     英国       27193.0  1999.0
-----------------------------------
    
    
​
# 统计每个州出现的国家数
df_data.groupby("year")["country"].count()
​
# 统计个数去重
df_data.groupby("year")[["country"]].nunique()
​
​
​
​
# 统计出现的国家数
df_data["country"].nunique()
​
# 统计出现的国家
df_data["country"].unique()

2.操作回顾

演示代码:

df_data = pd.DataFrame(
    np.random.randint(60,95,size=(6,6)),
    index=["张三","李四","王五","赵六","坤哥","凡哥"],
    columns=["语文","数学","英语","政治","历史","地理"]
)
print(df_data)
-----------------
   语文  数学  英语  政治  历史  地理
张三  62  79  94  81  68  63
李四  66  63  88  87  69  83
王五  94  62  89  60  84  71
赵六  84  85  86  76  93  74
坤哥  92  82  81  62  62  69
凡哥  70  68  71  70  62  93

---显示df_data的基础信息

df_data.info()
#--
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, 张三 to 凡哥
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   语文      6 non-null      int32
 1   数学      6 non-null      int32
 2   英语      6 non-null      int32
 3   政治      6 non-null      int32
 4   历史      6 non-null      int32
 5   地理      6 non-null      int32
dtypes: int32(6)
memory usage: 192.0+ bytes
    
    
    
df.describe()
#--
              语文         数学         英语         政治         历史         地理
count   6.000000   6.000000   6.000000   6.000000   6.000000   6.000000
mean   69.833333  75.833333  77.166667  82.000000  79.833333  71.166667
std     7.704977   6.337718  12.221566   8.694826  10.888832   8.518607
min    61.000000  66.000000  62.000000  70.000000  66.000000  62.000000
25%    66.000000  72.000000  66.500000  78.250000  71.500000  66.250000
50%    67.000000  78.500000  80.500000  80.000000  81.000000  69.000000
75%    74.000000  79.750000  87.000000  87.750000  86.750000  74.000000
max    82.000000  82.000000  89.000000  94.000000  94.000000  86.000000

2.1 索引切片

loc() 好用,行和列都能切.

1-展示df_data的前3行 .iloc[ ]

df_data.iloc[:3]

2-取出df_data的指定列

df_data.loc[:,["语文","英语"]]
df_data[["语文","英语"]]

3-取出指定行与列.loc[ ]

df_data.loc[df_data.index[[0,2,4]],["语文","数学","英语"]]

4-取出语文大于70的行

df_data[df_data["语文"] > 70]
df_data[(df_data["语文"] > 70) & (df_data["数学"]< 70)]

5-统计每个语文列成绩出现的次数

df_data["语文"].value_counts()

到此这篇关于pandas聚合分组的文章就介绍到这了,更多相关pandas聚合分组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Python命名空间namespace及作用域原理解析

    Python命名空间namespace及作用域原理解析

    这篇文章主要介绍了Python命名空间namespace及作用域原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • nginx搭建基于python的web环境的实现步骤

    nginx搭建基于python的web环境的实现步骤

    这篇文章主要介绍了nginx搭建基于python的web环境的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 使用 Python 遍历目录树的方法

    使用 Python 遍历目录树的方法

    这篇文章主要介绍了使用 Python 遍历目录树的方法,文中给大家提到了Python os.walk() 函数的相关知识,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2020-02-02
  • python中的继承机制super()函数详解

    python中的继承机制super()函数详解

    这篇文章主要介绍了python中的继承机制super()函数详解,super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序、重复调用等问题,需要的朋友可以参考下
    2023-08-08
  • Python读取Excel数据实现批量生成PPT

    Python读取Excel数据实现批量生成PPT

    我们常常面临着大量的重复性工作,通过人工方式处理往往耗时耗力易出错。而Python在办公自动化方面具有天然优势。本文将利用读取Excel数据并实现批量生成PPT,需要的可以参考一下
    2022-05-05
  • Python返回真假值(True or False)小技巧

    Python返回真假值(True or False)小技巧

    这篇文章主要介绍了Python返回真假值(True or False)小技巧,本文探讨的是最简洁的条件判断语句写法,本文给出了两种简洁写法,需要的朋友可以参考下
    2015-04-04
  • Python2手动安装更新pip过程实例解析

    Python2手动安装更新pip过程实例解析

    这篇文章主要介绍了Python2手动安装更新pip过程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Django执行源生mysql语句实现过程解析

    Django执行源生mysql语句实现过程解析

    这篇文章主要介绍了Django执行源生mysql语句实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Pytorch卷积神经网络resent网络实践

    Pytorch卷积神经网络resent网络实践

    这篇文章主要为大家介绍了Pytorch卷积神经网络resent网络实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python基于easygui实现pdf和word转换小程序

    Python基于easygui实现pdf和word转换小程序

    这篇文章主要为大家详细介绍了Python如何基于easygui实现pdf和word转换小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04

最新评论