基于排名条件删除DataFrame行:排序、填充与行删除处理
解决方案
步骤说明与代码实现
首先导入所需依赖库:
import pandas as pd import numpy as np
原DataFrame定义:
raw_data = { 'code': [1,1,1,1,2,2,2,2], 'Date': ['2022-01-04','2022-01-01', '2022-01-03','2022-01-02', '2022-01-08', '2022-01-07','2022-01-06','2022-01-05'], 'flag_check': [np.NaN, np.NaN, '11-33-24-33333' ,np.NaN, np.NaN,'11-55-24-33443' ,np.NaN, np.NaN], 'rank':[np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN] } df = pd.DataFrame(raw_data, columns=['code', 'Date','flag_check', 'rank'])
1. 转换日期格式并排序
先将Date列转为datetime类型,确保后续排序遵循正确的时间逻辑:
df['Date'] = pd.to_datetime(df['Date']) # 按code分组后对Date升序排序 df = df.sort_values(['code', 'Date'])
2. 填充rank列的连续序号
通过分组后的cumcount()方法生成从1开始的连续序号:
df['rank'] = df.groupby('code').cumcount() + 1
3. 删除flag_check非空行之后的所有行
自定义分组过滤函数,保留每个分组中第一个非空flag_check行及之前的所有内容:
def filter_group(group): flag_indices = group[group['flag_check'].notna()].index if flag_indices.size > 0: return group.loc[:flag_indices[0]] return group df = df.groupby('code', group_keys=False).apply(filter_group)
最终结果
执行上述代码后,输出的DataFrame如下:
code Date flag_check rank 1 1 2022-01-01 NaN 1 3 1 2022-01-02 NaN 2 2 1 2022-01-03 11-33-24-33333 3 7 2 2022-01-05 NaN 1 6 2 2022-01-06 NaN 2 5 2 2022-01-07 11-55-24-33443 3
内容的提问来源于stack exchange,提问作者Natali
相关产品推荐
相关产品推荐

