繁体   English   中英

使用 Pandas 计算累积平均值

[英]Calculate Cumulative Average using Pandas

我有一个如下的数据框。

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,则存在错误稍后在 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”是您最初的熊猫数据框。 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
def cumavg(s):
    avg=[s[0]]
    for i in range(1,len(s)):
        if s[i]!=0:
            if avg[i-1] ==0:
                avg.append(s[i])
            else:    
                avg.append((s[i]+avg[i-1])/2)
        else:
            avg.append(avg[-1])
    return np.array(avg)
df.apply(lambda s:cumavg(s),axis='columns')

给定以下数据框:

import pandas as pd
data = {
    '2001': {'Name1': 2, 'Name2': 1, 'Name3': 0},
    '2002': {'Name1': 5, 'Name2': 4, 'Name3': 5},
    '2003': {'Name1': 0, 'Name2': 2, 'Name3': 0},
    '2004': {'Name1': 0, 'Name2': 0, 'Name3': 0},
    '2005': {'Name1': 4, 'Name2': 4, 'Name3': 0},
    '2006': {'Name1': 6, 'Name2': 0, 'Name3': 2}
}
df = pd.DataFrame(data)

您基本上需要执行cumsum (按列,所以axis=1 ),然后将其除以所有不为0元素的cumsum

这可以通过以下方式完成:

df.cumsum(axis=1) / (df != 0).cumsum(axis=1)

结果将是:

       2001  2002      2003      2004      2005  2006
Name1   2.0   3.5  3.500000  3.500000  3.666667  4.25
Name2   1.0   2.5  2.333333  2.333333  2.750000  2.75
Name3   NaN   5.0  5.000000  5.000000  5.000000  3.50

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM