使用apply函数过滤年份,得到月份的平均值

2024-05-19 15:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的数据框中,有三列:年、月、VAL。我试图过滤掉低于某个阈值(即2007年)的年份值,然后获得分组月份的平均VAL(i、 e第9个月分别在200620006年(少于2007年)有三个值,因此合计总数(2.9+8+9)。我试过多种方法,但有些方法不太对劲。现在我犯的错误是“Keu错误'年'”,你知道我做错了什么吗? 提前谢谢

df2 = pd.DataFrame({'year': [2005,2006,2007,2005,2008,2006,2004,2007,2001,2006], 'month': 
[7,9,12,7,9,8,6,2,9,9], 'vals': [1.2,2.9,3.5,4.3,1.3,1.7,2.6,4.3,8.0,9.0]})
print(df2)

def mn(x,ylt):
if x['year'] < ylt:
    return x.mean()

df2.groupby('month')['vals'].apply(lambda x: mn(x,2007))

Tags: 数据方法错误阈值valyeardf2年份
1条回答
网友
1楼 · 发布于 2024-05-19 15:20:10

首先按^{}筛选,然后聚合mean

df = df2.loc[df2['year'] < 2007, 'vals'].groupby(df2['month']).mean().reset_index()
#alternative
#df = df2.loc[df2['year'] < 2007].groupby('month')['vals'].mean().reset_index()
print (df)
   month      vals
0      6  2.600000
1      7  2.750000
2      8  1.700000
3      9  6.633333

如果需要所有月份,也可以通过所有可能唯一的months添加不匹配的^{}

df = (df2.loc[df2['year'] < 2007, 'vals']
        .groupby(df2['month'])
        .mean()
        .reindex(df['month'].unique())
        .reset_index())
print (df)
   month      vals
0      2       NaN
1      6  2.600000
2      7  2.750000
3      8  1.700000
4      9  6.633333
5     12       NaN

您的函数应该通过筛选进行更改,但不幸的是,如果大型DataFrame中有许多组:

def mn(x,ylt):
    return x.loc[x['year'] < ylt, 'vals'].mean()

df = df2.groupby('month').apply(lambda x: mn(x,2007)).reset_index(name='vals')
print (df)

   month      vals
0      2       NaN
1      6  2.600000
2      7  2.750000
3      8  1.700000
4      9  6.633333
5     12       NaN

相关问题 更多 >