Pandas DataFrame groupby()函数

时间:2020-02-23 14:42:06  来源:igfitidea点击:

1.Pandas groupby()函数

Pandas DataFrame groupby()函数用于对具有相同值的行进行分组。
它通常与汇总函数(计数,总和,最小值,最大值,平均值)一起使用,以基于一个或者多个列值获取统计信息。

Pandas gropuby()函数与SQL group by语句非常相似。
毕竟,DataFrame和SQL Table也几乎相似。
这是一种中介功能,可以在达到最终结果之前创建组。

2.拆分应用合并

也称为拆分应用合并流程。
groupby()函数根据某些条件拆分数据。
将聚合函数应用于每个组,然后组合在一起以创建结果DataFrame。
下图通过一个简单的示例说明了此行为。

拆分应用合并示例

3. Pandas DataFrame groupby()语法

groupby()函数的语法为:

groupby(
      self,
      by=None,
      axis=0,
      level=None,
      as_index=True,
      sort=True,
      group_keys=True,
      squeeze=False,
      observed=False,
      **kwargs
  )
  • by参数确定分组元素的方式。
    通常,列名用于按DataFrame元素进行分组。

  • axis参数确定是对行还是对列进行处理。

  • 该级别与MultiIndex(分层)一起使用,以按一个或者多个特定级别分组。

  • as_index指定返回以组标签为索引的聚合对象。

  • sort参数用于对组密钥进行排序。
    我们可以将其作为False传递,以使用较大的DataFrame对象获得更好的性能。

  • group_keys:调用apply时,将组密钥添加到索引以标识片段。

  • 挤压:如果可能,减小返回类型的维数,否则返回一致的类型。

  • 已观察到:如果为True:仅显示分类石斑鱼的观察值。
    如果为False:显示分类石斑鱼的所有值。

  • ** kwargs:仅接受关键字参数" mutated",并传递给groupby。

groupby()函数根据调用对象返回DataFrameGroupBy或者SeriesGroupBy。

4.Pandas groupby()示例

假设我们有一个包含以下内容的CSV文件。

ID,Name,Role,Salary
1,hyman,Editor,10000
2,Lisa,Editor,8000
3,David,Author,6000
4,Ram,Author,4000
5,Anupam,Author,5000

我们将使用Pandas的read_csv()函数来读取CSV文件并创建DataFrame对象。

import pandas as pd

df = pd.read_csv('records.csv')

print(df)

输出:

ID    Name    Role  Salary
0   1  hyman  Editor   10000
1   2    Lisa  Editor    8000
2   3   David  Author    6000
3   4     Ram  Author    4000
4   5  Anupam  Author    5000

4.1)平均工资按角色分组

我们想根据员工的角色知道他们的平均工资。
因此,我们将使用groupby()函数根据"角色"列创建组。
然后调用聚合函数mean()来计算平均值并产生结果。
由于我们不需要ID和Name列,因此我们将从输出中将其删除。

df_groupby_role = df.groupby(['Role'])

# select only required columns
df_groupby_role = df_groupby_role[["Role", "Salary"]]

# get the average
df_groupby_role_mean = df_groupby_role.mean()

print(df_groupby_role_mean)

输出:

Salary
Role          
Author    5000
Editor    9000

输出中的索引看起来不太好。
我们可以通过调用reset_index()函数来修复它。

df_groupby_role_mean = df_groupby_role_mean.reset_index()
print(df_groupby_role_mean)

输出:

Role  Salary
0  Author    5000
1  Editor    9000

4.2)按角色支付的总工资

在此示例中,我们将计算为每个角色支付的薪水。

df_salary_by_role = df.groupby(['Role'])[["Role", "Salary"]].sum().reset_index()
print(df_salary_by_role)

输出:

Role  Salary
0  Author   15000
1  Editor   18000

此示例看起来很简单,因为所有操作都在一行中完成。
在前面的示例中,为清晰起见,我对步骤进行了划分。

4.3)按角色划分的员工总数

我们可以使用size()聚合函数来获取此数据。

df_size_by_role = df.groupby(['Role']).size().reset_index()
df_size_by_role.columns.values[1] = 'Count'  # renaming the size column
print(df_size_by_role)

输出:

Role  Count
0  Author      3
1  Editor      2