用列中最近邻的平均值输入缺失值

2024-04-25 22:58:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

df = pd.DataFrame(data=[676, 0, 670, 0, 668], index=['2012-01-31 00:00:00','2012-02-29 00:00:00',
                                                     '2012-03-31 00:00:00','2012-04-30 00:00:00',
                                                     '2012-05-31 00:00:00'])  
df.index.name = "Date"
df.columns = ["Number"]

看起来像:

^{pr2}$

如何输入第二个和第四个值(676+670)/2和(670+668)/2对应?在

我可以将值另存为np.array,并将它们输入数组中,但这太不可思议了!在


Tags: columns数据namenumberdataframedfdatadate
3条回答
#use apply to fill the Number with average from surrounding rows.
df['Number'] = df.reset_index().apply(lambda x: df.reset_index()\
                               .iloc[[x.name-1,x.name+1]]['Number'].mean() \
                               if (x.name>0) & (x.Number==0) else x.Number,axis=1).values

df
Out[1440]: 
                     Number
Date                       
2012-01-31 00:00:00   676.0
2012-02-29 00:00:00   673.0
2012-03-31 00:00:00   670.0
2012-04-30 00:00:00   669.0
2012-05-31 00:00:00   668.0

@spies006答案可改编为:

df.where(df.replace(to_replace=0, value=np.nan).isna(), other=(df.fillna(method='ffill') + df.fillna(method='bfill'))/2)

可以简化为:

^{pr2}$

我使用where方法并指定将任何0替换为np.nan。一旦我们将0指定为NaN,我们就可以使用fillna方法。通过使用ffillbfill,我们将所有{}填充为相应的先前值和后续值,将它们相加,然后除以2。在

df.where(df.replace(to_replace=0, value=np.nan),
 other=(df.fillna(method='ffill') + df.fillna(method='bfill'))/2)

                     Number
Date                       
2012-01-31 00:00:00   676.0
2012-02-29 00:00:00   673.0
2012-03-31 00:00:00   670.0
2012-04-30 00:00:00   669.0
2012-05-31 00:00:00   668.0

相关问题 更多 >

    热门问题