Python 按列/年移动平均值-蟒蛇、熊猫

Python 按列/年移动平均值-蟒蛇、熊猫,python,pandas,dataframe,moving-average,Python,Pandas,Dataframe,Moving Average,我需要建立一个前几年按国家[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

我需要建立一个前几年按国家[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年平均值(总奖牌)=2.0;1992年平均值(总奖牌)=(2.0+6.0)/2=4.0;1996年Acg(总奖牌)=(2.0+6.0+7.0)/3=5.0)-移动平均值应出现在新列(总奖牌旁边)


此外,对于每个国家和年份组合,新的“绩效”栏应为“奖牌总数”除以“移动平均数”的分数

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 
使用+
展开

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 

bonze滞后

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。扩展(2)
。如果您使用
x.expansing(1)
它们将不会出现。您需要按照@Erfan的建议展开(1)。我想我应该使用银柱,但你可以在其他柱上执行操作。只需更改标签。
df['total_mean']=df.groupby(level=0,sort=False)。奖牌。应用(lambda x:x.expanding(1.mean())
df.groupby('noc')。expanding(1.mean()
似乎很好。告诉我它是否有效我很乐意提供帮助