You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:54:55