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

Pandas重复填充前值问题:实现条件满足后的连续值填充

Pandas数据填充问题:满足条件后持续填充对应值

原始数据与代码

import pandas as pd

columns1 = ['Student ID', 'Course ID', 'Marks']
data1 = [(1, 10, 100), (2, 400, 200), (3, 30, 300), (3, 30, 300), (3, 30, 300), (3, 30, 300), (3, 30, 300), (3, 30, 300)]
df1 = pd.DataFrame(data1, columns=columns1)

原始数据表格:

Student IDCourse IDMarks
110100
2400200
330300
330300
330300
330300
330300
330300

尝试的代码及当前结果

尝试用np.where结合shift实现填充,但结果不符合预期:

import numpy as np
df1['s'] = np.where((df1['Course ID'] > df1['Marks']) == True, df1['Student ID'], df1['s'].shift(1)) 
df1

当前结果:

Student IDCourse IDMarkss
110100NaN
24002002
3303002
330300NaN
330300NaN
330300NaN
330300NaN
330300NaN

期望结果

当第2行满足Course ID > Marks条件后,后续所有行的s列都填充为2:

Student IDCourse IDMarkss
110100NaN
24002002
3303002
3303002
3303002
3303002
3303002
3303002

解决方案

方法一:使用np.where+ffill向前填充

先标记满足条件的行,再用向前填充补全后续NaN值:

import numpy as np

# 初始化s列:满足条件赋值Student ID,其余为NaN
df1['s'] = np.where(df1['Course ID'] > df1['Marks'], df1['Student ID'], np.nan)
# 向前填充所有NaN值,持续沿用最近的有效值
df1['s'] = df1['s'].ffill()

方法二:定位条件行后批量赋值

找到第一个满足条件的行,直接给后续所有行赋值:

# 获取第一个满足条件的Student ID
target_id = df1.loc[df1['Course ID'] > df1['Marks'], 'Student ID'].iloc[0]
# 获取该行的索引位置
target_index = df1[df1['Course ID'] > df1['Marks']].index[0]
# 给索引之后的所有行赋值
df1.loc[target_index:, 's'] = target_id

原代码问题说明

原代码中df1['s'].shift(1)仅能引用上一行的s值,但s列初始状态全为NaN,除了满足条件的行和紧邻的下一行,后续行无法获取有效前置值,导致出现大量NaN。使用ffill或批量赋值可解决这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:49:51