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

基于条件为Pandas DataFrame新增col4列并清理目标行的实现方案

解决方案

步骤1:标记触发行并生成分组标识

首先创建布尔掩码,定位col1为空字符串或NaN的触发行,再通过累加掩码生成分组ID,让每个触发行对应的后续数据归为同一组:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({"col1":["",99,88,np.nan,66,55,np.nan,11,22],"col2":['Catg0','Asset1','Other','Catg1','H & F','Large Item','Catg2','Fragile','Delicate item'],"col3":["",0,0,np.nan,99,155,np.nan,83,115]})

# 生成触发条件掩码
mask = df1['col1'].isna() | (df1['col1'] == '')
# 生成分组ID,每个触发行为分组起点
df1['group_id'] = mask.cumsum()

步骤2:填充col4列

提取每个分组对应的触发值(即分组内第一行的col2内容),将其映射到整个分组的col4中:

# 构建分组ID与触发值的映射关系
group_map = df1.loc[mask, ['group_id', 'col2']].set_index('group_id')['col2'].to_dict()
# 为所有行填充col4
df1['col4'] = df1['group_id'].map(group_map)

步骤3:清理数据得到最终结果

删除触发行和临时的group_id列:

# 过滤掉触发行,删除临时列
result_df = df1[~mask].drop(columns='group_id')
print(result_df)

最终输出

执行后得到的目标DataFrame:

col1           col2 col3   col4
1    99         Asset1    0  Catg0
2    88          Other    0  Catg0
4    66          H & F   99  Catg1
5    55     Large Item  155  Catg1
7    11        Fragile   83  Catg2
8    22  Delicate item  115  Catg2

简化版代码

如果想减少临时列,可直接用向前填充实现,代码更简洁:

mask = df1['col1'].isna() | (df1['col1'] == '')
# 仅保留触发行的col2值,然后向前填充覆盖所有行
df1['col4'] = df1.loc[mask, 'col2'].reindex(df1.index).ffill()
# 过滤触发行得到结果
result_df = df1[~mask]

内容的提问来源于stack exchange,提问作者itsavy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:56:00