看过来
《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 为分组列,索引 0、2 为各组的第一行数据,需要删除。
我们可以用多种思路来完成这个需求。第一个方法是先分组,然后用切片取每个子 DataFrame 的除第一条数据外的数据:
(
df.groupby('class', group_keys=False)
.apply(lambda x: x[1:], include_groups=False)
)
'''
class score
1 a 5
3 b 7
4 a 8
5 a 9
6 b 10
8 c 14
'''
分组后用 tail() 取各子 DataFrame 长度减一长度的数据:
(
df.groupby('class', group_keys=False)
.apply(lambda x: x.tail(len(x)-1), include_groups=False)
)
# ...
分组后,各子 DataFrame 用 drop() 方法删除第一个索引的数据:
(
df.groupby('class', group_keys=False)
.apply(lambda x: x.drop(x.index[0]), include_groups=False)
)
# ...
分组求得各个数据在其分组中的序号(秩),然后排除序号为 1 的数据:
df.groupby('class').score.rank()
'''
0 1.0
1 2.0
2 1.0
3 2.0
4 3.0
5 4.0
6 3.0
7 1.0
8 2.0
Name: score, dtype: float64
'''
df[df.groupby('class').score.rank() != 1]
# ...
以上几种方法都可以完成以上需求,你还有其他方法吗?
如果要保留各组的首尾两条数据怎么做呢?可以参考 pandas 按组选择第一行和最后一行数据 。
(完)
更新时间:Aug. 18, 2024, 4:12 p.m. 标签:pandas python 删除 分组