【问题标题】:Moving average by column / year - python, pandas按列/年移动平均 - python,pandas
【发布时间】:2019-10-30 19:31:36
【问题描述】:

我需要在“total_medals”列上按国家 [noc] 为所有前几年建立移动平均线 - 我的数据如下所示:

 medal     Bronze  Gold  Medal  Silver  **total_medals**
    noc year                                           
    ALG 1984     2.0   NaN    NaN     NaN           2.0
        1992     4.0   2.0    NaN     NaN           6.0
        1996     2.0   1.0            4.0           7.0
    ANZ 1984     2.0  15.0    NaN     2.0          19.0
        1992     3.0   5.0    NaN     2.0          10.0
        1996     1.0   2.0            2.0           5.0
    ARG 1984     2.0   6.0    NaN     3.0          11.0
        1992     5.0   3.0    NaN    24.0          32.0
        1992     3.0   7.0    NaN     5.0          15.0

我想要每个国家和年份的移动平均值(即对于 ALG:1984 Avg (total_medals)=2.0;1992 Avg(total_medals) = (2.0+6.0)/2 = 4.0;1996 Acg(total_medals) = ( 2.0+6.0+7.0)/3 = 5.0) - 移动平均线应出现在新列中(total_medals 旁边)。

此外,对于每个国家和年份组合,名为“表现”的新列应该是“总奖牌”除以“移动平均线”的分数

【问题讨论】:

  • 告诉我它是否有效
  • 我很乐意提供帮助

标签: python pandas dataframe moving-average


【解决方案1】:

示例数据框

print(df)

          medal  Bronze  Gold  Medal  Silver 
noc year                                     
ALG 1984    2.0     NaN   NaN    NaN     2.0 
    1992    4.0     2.0   NaN    NaN     6.0 
    1996    2.0     1.0   NaN    4.0     7.0 
ANZ 1984    2.0    15.0   NaN    2.0    19.0 
    1992    3.0     5.0   NaN    2.0    10.0 
    1996    1.0     2.0   NaN    2.0     5.0 
ARG 1984    2.0     6.0   NaN    3.0    11.0 
    1992    5.0     3.0   NaN   24.0    32.0 
    1992    3.0     7.0   NaN    5.0    15.0 

使用DataFrame.groupby + expanding:

df['total_mean']=df.groupby(level=0,sort=False).Silver.apply(lambda x: x.expanding(1).mean())
print(df)

          medal  Bronze  Gold  Medal  Silver  total_medals 
noc year                                                 
ALG 1984    2.0     NaN   NaN    NaN     2.0    2.000000 
    1992    4.0     2.0   NaN    NaN     6.0    4.000000 
    1996    2.0     1.0   NaN    4.0     7.0    5.000000 
ANZ 1984    2.0    15.0   NaN    2.0    19.0   19.000000 
    1992    3.0     5.0   NaN    2.0    10.0   14.500000 
    1996    1.0     2.0   NaN    2.0     5.0   11.333333 
ARG 1984    2.0     6.0   NaN    3.0    11.0   11.000000 
    1992    5.0     3.0   NaN   24.0    32.0   21.500000 
    1992    3.0     7.0   NaN    5.0    15.0   19.333333 

和尚落后

s=df.groupby('noc').apply(lambda x: x['Bronze']/x['total_medals'].shift())
s.index=s.index.droplevel()
df['bronze_lagged']=s

您可以为此创建一个函数...

def lagged_medals(type_of_medal):
    s=df.groupby('noc').apply(lambda x: x[type_of_medal]/x['total_medals'].shift())
    s.index=s.index.droplevel()
    df[f'{type_of_medal}_lagged']=s

lagged_medals('Silver')
#print(df)

【讨论】:

  • 非常感谢,事实上我需要'奖牌'的移动平均线,你能具体说明一下吗?为什么每个第一年都有一个“NaN”?应该有一个值,因为“奖牌”也有一个值
  • 我认为 NaN 是因为 x.expanding(2)。如果您使用x.expanding(1),它们将不会出现。
  • 您需要按照@Erfan 的建议展开(1)。我认为我应该使用银列,但您可以在其他列上执行操作。只需更改标签。
  • df['total_mean']=df.groupby(level=0,sort=False).medals.apply(lambda x: x.expanding(1).mean())
  • df.groupby('noc').expanding(1).mean() 似乎工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2018-05-08
  • 2019-04-19
  • 2015-04-03
  • 2019-10-01
  • 2021-06-18
相关资源
最近更新 更多