我有一个这样的数据集:

#Load the required libraries
import pandas as pd

#Create dataset
data = {'id': [1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1,
               2, 2,2,2,2,
               3, 3, 3, 3, 3, 3,
               4, 4,4,4,4,4,4,4,
               5, 5, 5, 5, 5,5, 5, 5,5],
        'cycle': [1,2, 3, 4, 5,6,7,8,9,10,11,
                  1,2, 3,4,5,
                  1,2, 3, 4, 5,6,
                  1,2,3,4,5,6,7,8,
                  1,2, 3, 4, 5,6,7,8,9,],
        'Salary': [7, 7, 7,8,9,10,11,12,13,14,15,
                   4, 5,6,7,8,
                   8,9,10,11,12,13,
                   8,1,2,3,4,5,6,7,
                   7, 7,9,10,11,12,13,14,15,],
        'Children': ['No', 'Yes', 'Yes', 'Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'No',
                     'Yes', 'No', 'Yes', 'No', 'Yes',
                     'No','Yes', 'Yes', 'No','No', 'Yes',
                     'Yes','Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes',
                      'No',  'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No',],
        'Days': [123, 128, 66, 66, 120, 141, 52,96, 120, 141, 52,
                 96, 120,128, 66, 120,
                 15,123, 128, 66, 120, 141,
                 141,128, 66, 123, 128, 66, 120,141, 
                 123, 128, 66, 123, 128, 66, 120, 141, 52,],
        }

#Convert to dataframe
df = pd.DataFrame(data)
print("df = \n", df)

数据帧如下所示:

enter image description here

在这里,每个id都有不同的周期,就像‘Cycle’列一样.例如,

ID-1最多有11个周期.

ID-2最多有5个周期.

ID-3最多有6个周期.

ID-4最多有8个周期.

ID-5最多有9个周期.

现在,对于每个id,我希望从底部删除行.

例如,

对于id-1,删除最后四行.

对于id-2,删除最后两行.

对于id-3,删除最后三行.

对于id-4,删除最后五行.

对于id-5,删除最后六行.

然后,数据帧如下所示:

enter image description here

有没有人可以告诉我如何用Python语言来完成这个任务?

推荐答案

为指定的已删除行数创建字典,并按计数器从后按GroupBy.cumcountascending=Falseid按列按Series.map进行比较,因此可能按boolean indexing进行筛选:

d = {1:4,2:2,3:3,4:5,5:6}

df = df[df.groupby('id').cumcount(ascending=False).ge(df['id'].map(d))]
print (df)
    id  cycle  Salary Children  Days
0    1      1       7       No   123
1    1      2       7      Yes   128
2    1      3       7      Yes    66
3    1      4       8      Yes    66
4    1      5       9      Yes   120
5    1      6      10       No   141
6    1      7      11       No    52
11   2      1       4      Yes    96
12   2      2       5       No   120
13   2      3       6      Yes   128
16   3      1       8       No    15
17   3      2       9      Yes   123
18   3      3      10      Yes   128
22   4      1       8      Yes   141
23   4      2       1      Yes   128
24   4      3       2      Yes    66
30   5      1       7       No   123
31   5      2       7      Yes   128
32   5      3       9       No    66

Python-3.x相关问答推荐

字符串块数组:如何根据一个数组中的元素对另一个数组中的元素进行分组

PYSMB中的进度条

tkinter treeview 如何在获取所选项目时将设置的对象作为对象返回

Heroku 中的未知错误代码缺少一个或多个参数

链接列未延伸到数据框的末尾

继承自 Counter 与 dict 的类实例的 Deepcopy

调用 Clear 时 Airflow 会加载新代码吗

安装没有 sudo 权限的 python3 和 pip3

使用 python 查找标记的元素

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

!date 的命令无法从 jupyter notebook 运行

避免重复连续字符但不包括一个特定字符的正则表达式

在气流中运行 DAG 时出现处理信号:ttou消息

为什么 setattr 在绑定方法上失败

Python 3.9.8 使用 Black 并导入 `typed_ast.ast3` 失败

Linux Mint 上的 Python3 错误没有名为蓝牙的模块

为什么 string.maketrans 在 Python 3.1 中不起作用?

变量类型注解NameError不一致

Windows 下 Python 3.x 的 OpenCV

三个参数的reduce函数