首页 > 解决方案 > 如何使用Python计算最近三个非nan值的平均值

问题描述

我有一个df如下所示的数据框。我想计算最后 3 个非 nan 列的平均值。如果非缺失列少于三个,则平均数缺失。

name day1 day2 day3 day4  day5 day6 day7
A    1     1   nan   2    3    0   3
B    nan   nan nan   nan  nan  nan 3
C    1     1   0     1    1    1   1
D    1     1   0     1    nan  1   4

预期输出应如下所示

name day1 day2 day3 day4  day5 day6 day7    expected 
A    1     1   nan   2    3    0   3        2     <-  1/3*(day5 + day6 + day7)
B    nan   nan nan   nan  nan  nan 3        nan   <-  less than 3 non-missing
C    1     1   0     1    1    1   1        1     <-  1/3*(day5 + day6 + day7)
D    1     1   0     1    nan  1   4        2    <-  1/3 *(day4 + day6 + day7)

我知道如何计算最后三列的平均值并计算有多少非缺失观察值。 df.iloc[:, 5:7].count(axis=1) average of the last three column df.iloc[:, 5:7].count(axis=1) number of non-nan in the last three column

如果有少于 3 个非缺失观察,我知道如何使用 df.iloc[:, 1:7].count(axis=1) <= 3.

但我正在努力寻找一种方法来计算最后三个非缺失列的平均值。谁能教我如何解决这个问题?

标签: pythonpandasnumpy

解决方案


向量化一个使用justify-

N = 3 # last N entries for averaging
avg = np.mean(justify(df.values,invalid_val=np.nan,axis=1, side='right')[:,-N:],1)
df['expected'] = avg

推荐阅读