Python 通用的group-by归约

  • Post category:Python

当我们在使用Python Pandas等库对数据进行分组及聚合统计时,通用的group-by 归约方法是可以大大简化我们的代码实现的。下面将对Python group-by的使用方法进行详细的讲解。

1. group-by的语法

group-by 是 Pandas库提供的重要函数之一,其基本语法如下:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

其中,参数说明如下:

  • by:指按照哪个或哪些列进行分组,可以传入一个或多个列表或Series;
  • axis:指按照哪个方向进行分组,0表示按行分组,1表示按列分组,默认值是0;
  • level:指定按照哪个多级索引标签进行分组;
  • as_index:指定是否将分组by作为结果DataFrame的索引,默认为True;
  • sort:表示是否对结果进行排序,默认True,排序后结果更易读;
  • group_keys:指定是否对满足条件的组进行标注,默认为True;
  • squeeze:指定结果是否为Series类型,默认为False(DataFrame类型)。

groupby函数接收一个或多个列的名字(或 DataFrame/ Series中的列索引),最终返回以该列或这些列为分类标准,同类元素放在一组的 dictionary 类型组合数据。

2. group-by的示例

实例1:按照单个列分组

以下代码演示了如何按照一个列进行分组:

import pandas as pd

data = {'name': ['张三', '李四', '王五', '小明', '小红', '小张', '小王', '小李'], 'class': ['One', 'Two', 'Three', 'One', 'Two', 'One', 'One', 'Three'], 'score': [90, 88, 78, 98, 86, 87, 84, 76]}

df = pd.DataFrame(data)
g = df.groupby('class')
print(g.groups)

输出结果:

{'One': [0, 3, 5, 6], 'Three': [2, 7], 'Two': [1, 4]}

实例2:按照多个列分组

以下代码演示了如何按照多个列进行分组:

import pandas as pd

data = {'name': ['张三', '李四', '王五', '小明', '小红', '小张', '小王', '小李'], 'class': ['One', 'Two', 'Three', 'One', 'Two', 'One', 'One', 'Three'], 'score': [90, 88, 78, 98, 86, 87, 84, 76]}
df = pd.DataFrame(data)
g = df.groupby(['class', 'score'])
print(g.groups)

输出结果:

{('One', 84): [6], ('One', 87): [5], ('One', 90): [0], ('One', 98): [3], ('Three', 76): [7], ('Three', 78): [2], ('Two', 86): [4], ('Two', 88): [1]}

从输出结果可以看出,分组结果以元组形式展示,表示按照class和score两个列进行分组。