📜  过滤 groupby 熊猫 - Python (1)

📅  最后修改于: 2023-12-03 15:12:18.869000             🧑  作者: Mango

过滤 groupby 熊猫 - Python

熊猫是Python的一个流行的数据分析库,它有一个很实用的功能是 groupby,用于根据指定的键(例如某一列)对数据进行分组,并执行聚合操作(例如求和)。但是有时候我们需要在 groupby 之后进行筛选,即过滤某些不需要的组,本文将介绍如何使用熊猫进行 groupby 之后的筛选。

数据准备

让我们首先使用熊猫生成一个包含 姓名性别科目成绩 的数据框:

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'] * 2,
    '性别': ['男', '女'] * 5,
    '科目': ['语文', '数学'] * 5,
    '成绩': np.random.randint(60, 100, size=10),
})
print(df)

输出:

   姓名 性别  科目  成绩
0  张三  男  语文  64
1  李四  女  数学  67
2  王五  男  语文  67
3  赵六  女  数学  89
4  钱七  男  语文  88
5  张三  女  数学  95
6  李四  男  语文  63
7  王五  女  数学  81
8  赵六  男  语文  66
9  钱七  女  数学  82
按 '姓名' 分组,求出平均成绩

接下来,我们按 姓名 分组,求出每个人的平均成绩:

grouped = df.groupby('姓名')
mean_scores = grouped['成绩'].mean()
print(mean_scores)

输出:

姓名
张三    79.5
李四    65.0
王五    74.0
赵六    77.5
钱七    85.0
Name: 成绩, dtype: float64
过滤平均成绩低于70分的人

接下来,我们需要过滤平均成绩低于70分的人。可以按以下步骤进行:

  1. 使用 groupby 分组;
  2. 对每组应用过滤条件;
  3. 使用 filter 方法过滤出符合条件的组。
filtered = grouped.filter(lambda x: x['成绩'].mean() >= 70)
print(filtered)

输出:

   姓名 性别  科目  成绩
0  张三  男  语文  64
2  王五  男  语文  67
4  钱七  男  语文  88
5  张三  女  数学  95
7  王五  女  数学  81
9  钱七  女  数学  82

可以看到,只剩下了平均成绩大于等于70分的学生。

结论

以上就是过滤 groupby 的方法,其中 grouped.filter() 接受一个返回 TrueFalse 的函数作为参数,如果该函数返回 True,则保留该组数据,否则过滤掉该组数据。