基于条件为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
相关产品推荐
相关产品推荐

