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

如何在Pandas大数据集中仅填充指定数值(999与100)之间的NaN值

解决Pandas中仅填充100与999之间NaN值的问题

这需求挺有针对性的,咱们得精准定位那些被100和999“包围”的NaN,其他位置的NaN就留着不动。下面是具体实现步骤和代码:

步骤1:导入库并定义原始数据集

首先先把需要的库和数据集准备好:

import pandas as pd
import numpy as np

# 定义原始数据集
df = pd.DataFrame({
    'col1': [1,2,3,4,5,6,7,8,9,10,11,12],
    'col2': [100,np.nan,100,np.nan,np.nan,999,999,np.nan,100,np.nan,np.nan,100]
})

步骤2:标记并分组关键值区间

我们需要先把col2里的100和999标记出来,然后用这些标记点把数据分成不同的组,这样就能识别出哪些组是同时包含100和999的(也就是中间夹着要填充的NaN的组):

# 标记出col2中是100或999的位置
mask = df['col2'].isin([100, 999])

# 用cumsum生成组号:每遇到一个标记点,组号加1
groups = mask.cumsum()

# 筛选出同时包含100和999的组
valid_groups = (
    df[mask]
    .groupby(groups[mask])['col2']
    .agg(lambda x: {100, 999}.issubset(x))  # 判断组内是否同时有100和999
    .loc[lambda x: x]  # 只保留符合条件的组
    .index
)

步骤3:定位要填充的NaN并完成填充

现在我们已经知道哪些组是需要处理的,接下来就定位这些组里的NaN,然后填充成500:

# 生成需要填充的布尔索引
to_fill = df['col2'].isna() & groups.isin(valid_groups)

# 填充指定位置的NaN
df.loc[to_fill, 'col2'] = 500

验证结果

运行完上面的代码后,查看col2的结果:

print(df['col2'])

输出和预期完全一致:

0     100.0
1       NaN
2     100.0
3     500.0
4     500.0
5     999.0
6     999.0
7     500.0
8     100.0
9       NaN
10      NaN
11    100.0
Name: col2, dtype: float64

代码逻辑解释

  • 用mask标记关键值:先把100和999的位置标出来,这些是我们的“边界点”。
  • 分组识别有效区间:通过cumsum()把相邻的边界点之间的区域分成组,然后筛选出同时包含100和999的组——这些组里的NaN就是我们要处理的。
  • 精准填充:最后只对这些有效组里的NaN进行填充,其他NaN保持原样。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:02:40