如何用0.1增量填充Pandas DataFrame中的缺失值?
解决Pandas DataFrame缺失值按固定增量填充的问题
我明白你的需求啦——就是要把DataFrame里的NaN值,以前一个非缺失值为起点,每次递增0.1来填充对吧?你提到用np.arange是个不错的思路,不过我们可以结合Pandas的分组功能来把这个逻辑落地,具体操作看下面:
第一步:先构造你的示例数据
首先我们先把你给出的DataFrame创建出来,方便后续测试:
import pandas as pd import numpy as np # 构造目标DataFrame df = pd.DataFrame( {'A': [1, np.nan, 2, np.nan, np.nan, 3, 4, np.nan, 5, np.nan]}, index=[0, 1, 2, 3, 4, 5, 6, 8, 9, 10] )
第二步:核心填充逻辑
我们的思路是把每个非缺失值+后续连续的NaN划分为一个分组,然后给每组内的行标记“偏移序号”,最后用基准值(前一个非缺失值)加上偏移序号*0.1得到填充值:
# 1. 创建分组标识:每个非缺失值及其后续NaN为同一组 groups = df['A'].notna().cumsum() # 2. 计算每组内的行偏移量(从0开始计数) offsets = df.groupby(groups).cumcount() # 3. 计算填充后的值:基准值(前向填充的非缺失值) + 偏移量*0.1 df['A'] = df['A'].ffill() + offsets * 0.1
如果你想更简洁,也可以把这几步写成链式操作,不用单独保存中间变量:
df['A'] = df['A'].ffill() + df.groupby(df['A'].notna().cumsum()).cumcount() * 0.1
看看结果
现在打印df['A']就能得到你想要的效果:
0 1.0 1 1.1 2 2.0 3 2.1 4 2.2 5 3.0 6 4.0 8 4.1 9 5.0 10 5.1 Name: A, dtype: float64
原理简单解释
df['A'].notna().cumsum():非缺失值的位置会返回True(即1),累加后会给每个连续的“非缺失值+NaN块”分配唯一的组号,比如第一个非缺失值1和后面的NaN是组1,第二个非缺失值2和后面两个NaN是组2,以此类推。groupby(groups).cumcount():给每个组内的行从0开始计数,非缺失值本身的偏移量是0,所以加0后还是原值;后面的NaN依次是1、2...乘以0.1就正好是你要的增量。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

