代码之家  ›  专栏  ›  技术社区  ›  Anji

使用熊猫计算累积平均值

  •  0
  • Anji  · 技术社区  · 6 年前

    我有一个如下的数据帧。

    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  
    

    预期输出如下所示。

    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  
    
    0 回复  |  直到 6 年前
        1
  •  3
  •   Fabrizio    6 年前

    事实上,这里有(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())
    

    下面是我的代码的结果:

        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
    
        2
  •  0
  •   Mohammed Khalid    6 年前
    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')
    
        3
  •  0
  •   villoro    6 年前

    给定以下数据帧:

    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

    这可以通过以下方式实现:

    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