如何基于多列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
相关产品推荐
相关产品推荐

