看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在之前的pandas 删除每个分组中的第一个数据的案例中,我们删除了各组的第一条数据,但时有时候我们需要保留第一条数据和最后一条数据,比如在实验中,第一条是初始结论,最后一条是最终的结果,我们不需要中间的过程数据,应该怎么办呢?
我们构造数据如下,这个数据还是和之前一样:
import pandas as pd
df = pd.DataFrame({'class': ['a', 'a', 'b', 'b', 'a', 'a', 'b', 'c', 'c'],
'score': [3, 5, 6, 7, 8, 9, 10, 11, 14]})
df
'''
class score
0 a 3
1 a 5
2 b 6
3 b 7
4 a 8
5 a 9
6 b 10
7 c 11
8 c 14
'''
class 为分组列,要根据这个分组来保留组内的第一条和最后一条数据。
我们有两个思路,但肯定是要先按 class 分组产生分组对象,然后:
要注意的是,第二个方法是在子 DataFrame 内部拼接,apply 后将拼接好的所有 DataFrame 再拼接成为最终的 DataFrame。
使用第一个思路:
(
df.groupby('class', group_keys=False)
.apply(lambda x: x.iloc[[0, -1]])
)
'''
class score
0 a 3
5 a 9
2 b 6
6 b 10
7 c 11
8 c 14
'''
使用第二个思路:
(
df.groupby('class', group_keys=False)
.apply(lambda x: pd.concat([x.head(1), x.tail(1)]))
)
'''
class score
0 a 3
5 a 9
2 b 6
6 b 10
7 c 11
8 c 14
'''
以上几种方法都可以完成以上需求。另外,可以思考下,第二个思路不用 apply 而用 pipe 来应用会产生什么样的结果呢?
(完)
更新时间:2024-08-18 16:21:46 标签:pandas python 筛选 分组