如何基于另一列的相同子串为DataFrame行设置新值?
解决DataFrame中特定分组的TOP列填充问题
问题场景
现有如下Pandas DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({"CLASS":["AG_1","AG_2","AG_3","MAR","GOM"], "TOP":[200, np.nan, np.nan, 600, np.nan], "BOT":[230, 250, 380, np.nan, 640]})
初始输出:
CLASS TOP BOT 0 AG_1 200.0 230.0 1 AG_2 NaN 250.0 2 AG_3 NaN 380.0 3 MAR 600.0 NaN 4 GOM NaN 640.0
需求:为CLASS列以AG开头的行填充TOP列缺失值,规则是将其设为上一行的BOT值,最终期望输出:
CLASS TOP BOT 0 AG_1 200.0 230.0 1 AG_2 230.0 250.0 2 AG_3 250.0 380.0 3 MAR 600.0 NaN 4 GOM NaN 640.0
实现方法
方法一:直接定位目标行填充
通过布尔掩码筛选目标行,利用shift()获取上一行的BOT值填充TOP,最后保留第一行的原始值:
# 生成CLASS以AG开头的布尔掩码 ag_mask = df['CLASS'].str.startswith('AG') # 用对应行上一行的BOT值填充TOP列 df.loc[ag_mask, 'TOP'] = df.loc[ag_mask, 'BOT'].shift(1) # 恢复AG_1行的原始TOP值(shift后第一行为NaN) df.loc[ag_mask, 'TOP'] = df.loc[ag_mask, 'TOP'].fillna(df.loc[ag_mask, 'TOP'].iloc[0])
方法二:分组处理(更通用)
如果存在多个类似前缀的分组,可按CLASS前缀分组后批量处理:
# 按CLASS的前两位前缀分组,在组内填充TOP缺失值 df['TOP'] = df.groupby(df['CLASS'].str[:2])['TOP'].transform( lambda x: x.fillna(x.index.map(df['BOT'].shift(1))) )
两种方法都能得到期望的输出结果,方法一更直观适合单一分组场景,方法二更适合多分组批量处理的场景。
内容的提问来源于stack exchange,提问作者user026
相关产品推荐
相关产品推荐

