如何在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
相关产品推荐
相关产品推荐

