如何在Pandas DataFrame中按层级条件填充com标识至停止条件
问题
我有一个包含百万级数据的DataFrame,数据示例如下:
import pandas as pd df = pd.DataFrame({'level':[1,1,1,2,3,2,2,1,2,1,2,3,3,4,5,2,3,4,5,1,1], 'type':['','','com','','','','','','','','com','','','','','','','com','','','']}) print(df)
输出:
level type 0 1 1 1 2 1 com 3 2 4 3 5 2 6 2 7 1 8 2 9 1 10 2 com 11 3 12 3 13 4 14 5 15 2 16 3 17 4 com 18 5 19 1 20 1
需求:将该DataFrame清洗为如下格式:在type列出现"com"的行之后,将后续空白行的type_new列填充为"com",直到遇到level值小于等于该"com"所在行level值的行为止。
目标输出示例:
level type type_new 0 1 1 1 2 1 com com 3 2 com 4 3 com 5 2 com 6 2 com 7 1 8 2 9 1 10 2 com com 11 3 com 12 3 com 13 4 com 14 5 com 15 2 16 3 17 4 com com 18 5 com 19 1 20 1
实现思路
针对百万级数据,必须采用向量式操作避免逐行循环,保证处理效率,核心步骤如下:
- 标记所有
type == 'com'的行,记录对应level值; - 用向前填充(
ffill)将最近的com行level传递给后续行,直到遇到level <= 该com行level的重置节点; - 通过重置节点生成分组,每个分组对应一个com行的有效覆盖区间;
- 对包含com行的分组,将com行本身及分组内
level > com行level的行的type_new填充为"com"。
代码实现
import pandas as pd # 加载原始数据 df = pd.DataFrame({'level':[1,1,1,2,3,2,2,1,2,1,2,3,3,4,5,2,3,4,5,1,1], 'type':['','','com','','','','','','','','com','','','','','','','com','','','']}) # 1. 标记com行和对应的level df['com_flag'] = df['type'] == 'com' df['com_level'] = df['level'].where(df['com_flag'], pd.NA) # 2. 向前填充最近的com level,直到遇到重置点 df['active_com_level'] = df['com_level'].ffill() # 3. 标记重置点:当前level <= 激活的com level时,停止填充 df['reset'] = (df['level'] <= df['active_com_level']).fillna(False).astype(int) # 4. 生成分组,每个分组对应一个com的有效区间 df['group'] = df['reset'].cumsum() # 5. 筛选需要填充"com"的行:属于包含com的分组,且是com行或level > 激活的com level com_groups = df[df['com_flag']]['group'].unique() fill_mask = df['group'].isin(com_groups) & (df['com_flag'] | (df['level'] > df['active_com_level'])) # 6. 创建并填充type_new列 df['type_new'] = '' df.loc[fill_mask, 'type_new'] = 'com' # 清理临时辅助列 df.drop(columns=['com_flag', 'com_level', 'active_com_level', 'reset', 'group'], inplace=True) print(df)
说明
- 全程使用pandas内置向量操作,无显式循环,处理百万级数据效率极高;
- 自动处理连续多个com行、com行出现在末尾等边界情况;
- 辅助列可按需保留或删除,不影响最终结果。
内容的提问来源于stack exchange,提问作者haidang
相关产品推荐
相关产品推荐

