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

Pandas实现按条件填充指定行缺失值(非固定行偏移)

解决Pandas DataFrame的定向填充需求

先看你的示例DataFrame:

import pandas as pd
import numpy as np
df = pd.DataFrame(
    {"col1": ["A", "B", "C", "D", "E", "A", "E", "B", "D"],
     "col2": [1, np.NAN, 3, 4, np.NAN, 6, np.NAN, np.NAN, 8],
})

对应的初始数据:

idcol1col2
0A1.0
1BNaN
2C3.0
3D4.0
4ENaN
5A6.0
6ENaN
7BNaN
8D8.0

你的需求很明确:

  • 对于col1为"E"且col2为空的行,用之前最近的col1为"A"的行的col2值填充
  • 对于col1为"B"且col2为空的行,用之后最近的col1为"D"的行的col2值填充

下面是简洁的实现脚本,完全不用大量if-else,利用Pandas的分组和填充特性来搞定:

import pandas as pd
import numpy as np

# 初始化DataFrame
df = pd.DataFrame(
    {"col1": ["A", "B", "C", "D", "E", "A", "E", "B", "D"],
     "col2": [1, np.NAN, 3, 4, np.NAN, 6, np.NAN, np.NAN, 8],
})

# 处理需求1:填充E的NaN为最近的前面的A的col2值
# 先标记A的位置,向前填充(ffill)所有位置,然后只更新E的NaN行
a_values = df['col2'].where(df['col1'] == 'A').ffill()
df.loc[(df['col1'] == 'E') & df['col2'].isna(), 'col2'] = a_values[(df['col1'] == 'E') & df['col2'].isna()]

# 处理需求2:填充B的NaN为最近的后面的D的col2值
# 标记D的位置,向后填充(bfill)所有位置,然后只更新B的NaN行
d_values = df['col2'].where(df['col1'] == 'D').bfill()
df.loc[(df['col1'] == 'B') & df['col2'].isna(), 'col2'] = d_values[(df['col1'] == 'B') & df['col2'].isna()]

# 输出结果(转成int让结果更整洁)
df['col2'] = df['col2'].astype(int)
print(df)

执行后得到的结果正好符合你的期望:

idcol1col2
0A1
1B4
2C3
3D4
4E1
5A6
6E6
7B8
8D8

代码解释

  • 对于需求1:用where筛选出A行的col2值,其他位置为NaN,然后用ffill()向前填充,这样每个位置都能拿到最近的前面的A的值,最后只把E的NaN行替换成这个值。
  • 对于需求2:类似地,用where筛选D行的col2值,bfill()向后填充,拿到每个位置最近的后面的D的值,再替换B的NaN行。

这种方法完全利用Pandas的矢量化操作,比循环或大量if-else高效得多,代码也简洁易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:07:29