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

如何基于另一列的相同子串为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:10:37