看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
一个潜水队进行日常训练,教练会记录队员每次潜水的数据,现在需要统计筛选出每次潜水都达到一个指定的深度。
教练记录的数据如下:
import pandas as pd
df = pd.DataFrame({
'name': list('aaabbcc'),
'deep': [-2, -3, -5, -6, -2, -5, -5]
})
# 数据
df
'''
name deep
0 a -2
1 a -3
2 a -5
3 b -6
4 b -2
5 c -5
6 c -5
'''
其中 name 是潜水员的名称,deep 为潜水深度,此为伪造数据。
由于源数据是一个平铺的数据,要得到每个队员的数据,就需要对数据按队员进行分组。分组后,取得每个组(每个队员)的成绩,让这个队员的成绩都小于一个值(比如 -4),这里可以用 all 方法进行操作,如果所有值满足表达式会为 True。通过 all 得到的布尔序列里我们选择为 True 的数据,就是满足条件的队员。
最后用 loc 对原数据进行筛选,条件表达可以用 df.name.isin()。
根据思路,最终代码实现过程如下:
# 按运动员分组
df.groupby('name').apply(lambda x: x.deep)
'''
name
a 0 -2
1 -3
2 -5
b 3 -6
4 -2
c 5 -5
6 -5
Name: deep, dtype: int64
'''
# 接上,分组后每个运动员所有的成绩小于n,n=-4
selected = df.groupby('name').apply(lambda x: (x.deep < -4).all())
selected
'''
name
a False
b False
c True
dtype: bool
'''
# 接上,筛选出符合的用户
selected[selected].index
# Index(['c'], dtype='object', name='name')
# 最终筛选结果
df.loc[df.name.isin(selected[selected].index.tolist())]
'''
name deep
5 c -5
6 c -5
'''
# 另外,如果选择出相反的数据,在条件表达式前加 ~ 即可
df.loc[~df.name.isin(selected[selected].index.tolist())]
最终筛选出每次都潜入 4 米以下的队员 C 的所有数据。
更新时间:2024-08-18 15:40:51 标签:pandas python 分组 筛选