我有一个如下的数据框。
Name 2001 2002 2003 2004 2005 2006
Name1 2 5 0 0 4 6
Name2 1 4 2 0 4 0
Name3 0 5 0 0 0 2
我想使用 pandas 计算每行的累积平均值,但是在计算平均值时它必须忽略该值是否为零。
预期输出如下。
Name 2001 2002 2003 2004 2005 2006
Name1 2 3.5 3.5 3.5 3.75 4.875
Name2 1 2.5 2.25 2.25 3.125 3.125
Name3 0 5 5 5 5 3.5
最佳答案
首先,根据您的评论,我认为您的计算中也存在数学问题。 如果在第一行中,您取 3.5(即您所说的当前累积值)加上 4(第一行中 2005 年的值)并给出 --> (3.5+4)/2= 3.75,则出现错误后来在第 2 行第 2 列 2005 年。 事实上,有 (2.25 + 4)/2 = 3.125。你写的是3.175。
现在我相信有更好的方法来实现我的解决方案,但我在这里得到了您所需要的。
def cumulative_av(x):
b=[]
b.append(x[0])
for i in range(1,len(x)):
if(x[i]!=0 and b[-1]!=0):
b.append((x[i]+b[-1])*0.5)
elif(x[i]!=0 and b[-1]==0):
b.append(x[i])
elif(x[i]==0 and b[-1]!=0):
b.append(b[-1])
elif(x[i]==0 and b[-1]==0):
b.append(0)
return(b)
apd2=pd.DataFrame(columns=["2001", "2002", "2003", "2004", "2005", "2006"])
for i in range(3):
apd2.loc[i]=cumulative_av(apd.loc[i,].to_list())
其中“apd”是您最初的 pandas 数据框。 cumulative_av是一个生成您定义的函数(在我看来这是一个非常奇怪的函数)。
这是我的代码的结果:
2001 2002 2003 2004 2005 2006
0 2.0 3.5 3.50 3.50 3.750 4.875
1 1.0 2.5 2.25 2.25 3.125 3.125
2 0.0 5.0 5.00 5.00 5.000 3.500
关于python - 使用 Pandas 计算累积平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59927483/