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

基于ReportName列条件的Pandas ffill与bfill空值填充问题

按区间填充DataFrame的ID列

现有如下结构的DataFrame:

import pandas as pd

data = {
    "ReportName": ["Sample cycle", 'Message',  "ID", "m1", "Uncertainty m1", "Message", "Sample cycle", 'Message', "ID", "m0", "Uncertainty m0", "Message", "ID", "m1", "Uncertainty m1", "Message"],
    "Values": [ "1","NO", "II", None, None, "NO", "1", "NO", "ID1", "1.8", "0.43", "NO", "ID2", "1.5", "0.41", "NO"],
}
df = pd.DataFrame(data)

已经通过以下函数生成了初始的ID列:

def extract_id(row):
    if row['ReportName'] == 'ID':
        return row['Values']
    return None

df['ID'] = df.apply(extract_id, axis=1)

现在需要实现:在每个"Sample cycle"到下一个"Sample cycle"的区间内,用该区间对应的ID值填充ID列中的NaN,同时"Sample cycle"所在行的ID保持为None,最终期望输出如下:

ReportName Values    ID
0     Sample cycle      1  None
1          Message     NO    II
2               ID     II    II
3               m1   None    II
4   Uncertainty m1   None    II
5          Message     NO    II
6     Sample cycle      1  None
7          Message     NO   ID1
8               ID    ID1   ID1
9               m0    1.8   ID1
10  Uncertainty m0   0.43   ID1
11         Message     NO   ID1
12              ID    ID2   ID2
13              m1    1.5   ID2
14  Uncertainty m1   0.41   ID2
15         Message     NO   ID2

实现方案

通过分组+填充的方式完成,具体代码如下:

# 生成分组标记:每遇到一个"Sample cycle"就创建一个新分组
df['group'] = df['ReportName'].eq('Sample cycle').cumsum()

# 对每个分组内的ID列进行向后填充,自动用该分组内的有效ID填充后续NaN
df['ID'] = df.groupby('group')['ID'].bfill()

# 将"Sample cycle"行的ID重置为None
df.loc[df['ReportName'] == 'Sample cycle', 'ID'] = None

# 删掉临时的分组列
df = df.drop('group', axis=1)

运行上述代码后,就能得到符合要求的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:48:15