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

如何基于多列ID与时间戳填充Pandas DataFrame中空的attempt_no列

解决方案:基于锚点行填充Pandas DataFrame的attempt_no值

这是一个典型的基于锚点行填充后续缺失值的问题,结合你的示例和核心逻辑,我整理了一套清晰可行的实现步骤:


步骤1:预处理空白值

首先需要把DataFrame中的空白字符串转换为NaN,因为Pandas的缺失值处理函数都是基于NaN工作的:

import pandas as pd
import numpy as np

# 替换所有空白字符串为NaN
df = df.replace('', np.nan)

步骤2:创建分组标识

我们需要把每个带有user_id的行作为"锚点",将后续行直到下一个锚点划分为同一个分组。可以用累计求和快速实现:

# 每当遇到非空的user_id,分组编号自动+1
df['group'] = df['user_id'].notna().cumsum()

这样你的数据会被自动分成4个分组:行0-3为group1,行4-6为group2,行7-8为group3,行9-10为group4,完美匹配你示例中的分段逻辑。

步骤3:组内填充attempt_no

在每个分组内,锚点行的attempt_no是有效值,我们只需要将这个值前向填充到分组内的所有空白行即可:

# 按分组对attempt_no执行前向填充
df['attempt_no'] = df.groupby('group')['attempt_no'].ffill()

步骤4:(可选)清理临时列

如果不需要保留分组标识列,可以直接删除:

df = df.drop('group', axis=1)

结果验证

运行完上述代码后,你的DataFrame会完全匹配期望输出:比如行10的attempt_no会被填充为4,因为它属于group4,而该组的锚点行(行9)的attempt_no是4。

逻辑调整补充

如果你的核心逻辑确实是仅填充与锚点行ne1_id相同的后续行,可以把步骤3调整为按分组+ne1_id双重分组后填充:

df['attempt_no'] = df.groupby(['group', 'ne1_id'])['attempt_no'].ffill()

这样group4中的行10(ne1_id=100)会因为和锚点行ne1_id不同而保持NaN,你可以根据实际需求选择是否使用这个版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:47:33