看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
有些场景下需要筛选满足条件则整组数据被选中,如分组统计:如果需要统计每一组数据中满足某些特定条件的数据,选中满足条件的整组数据;数据过滤:如果需要过滤掉某些不符合要求的数据,只保留满足条件的整组数据;数据分析:如果需要分析某一类数据,选中满足条件的整组数据进行分析;数据探索:如果需要探索某一组数据的特征,选中满足条件的整组数据进行探索。
在本例中,我们通过一个简单的例子,来看看如何用 pandas 实现此类需求。
源数据及构造方法如下:
import pandas as pd
from io import StringIO
data = '''
姓名 年龄 学校 成绩 类别
小明 15 一中 99 4
小美 12 一中 63 1
灰灰 19 一中 85 2
铭铭 12 一中 76 2
豪豪 15 一中 55 4
小黄 18 二中 68 3
小黑 16 二中 85 3
'''
df = pd.read_csv(StringIO(data), sep=r'\s+')
df
# ...
需求为要找出满足年龄和学校相同、并且其中有类别不为 1 的几组数据,根据需求可以发现,小明和豪豪这两条数据是符合要求的。接下来,我们看看如何编写代码。
需求中,年龄和学校要相同,我们可以用这两列分组,分组后如果数据条数大于 1,则先满足了第一个条件,接下来再判断分组后的类别是有没有 1,如果没有则表示符合条件。
先按年龄和学校分组,并使用分组对象的 filter() 方便过虑保留满足条件的组:
(
df.groupby(['年龄', '学校'])
.filter(lambda x: (len(x) > 1) & (1 not in x.类别.to_list() ))
)
这段 pandas 代码进行数据处理的逻辑如下。
因此,这段代码的效果是:对于数据中每个组,如果该组中数据的行数不大于 1 或 '类别' 列中有 1,则会过滤掉该组,剩下的组将会组成一个新的 DataFrame,并作为该代码的最终结果返回。
这样,我们就完成了这个需求。
(完)
更新时间:2024-08-18 16:12:03 标签:pandas python 分组 过滤