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 ID | Course ID | Marks |
|---|---|---|
| 1 | 10 | 100 |
| 2 | 400 | 200 |
| 3 | 30 | 300 |
| 3 | 30 | 300 |
| 3 | 30 | 300 |
| 3 | 30 | 300 |
| 3 | 30 | 300 |
| 3 | 30 | 300 |
尝试的代码及当前结果
尝试用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 ID | Course ID | Marks | s |
|---|---|---|---|
| 1 | 10 | 100 | NaN |
| 2 | 400 | 200 | 2 |
| 3 | 30 | 300 | 2 |
| 3 | 30 | 300 | NaN |
| 3 | 30 | 300 | NaN |
| 3 | 30 | 300 | NaN |
| 3 | 30 | 300 | NaN |
| 3 | 30 | 300 | NaN |
期望结果
当第2行满足Course ID > Marks条件后,后续所有行的s列都填充为2:
| Student ID | Course ID | Marks | s |
|---|---|---|---|
| 1 | 10 | 100 | NaN |
| 2 | 400 | 200 | 2 |
| 3 | 30 | 300 | 2 |
| 3 | 30 | 300 | 2 |
| 3 | 30 | 300 | 2 |
| 3 | 30 | 300 | 2 |
| 3 | 30 | 300 | 2 |
| 3 | 30 | 300 | 2 |
解决方案
方法一:使用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
相关产品推荐
相关产品推荐

