熊猫使用Apply函数过滤年份并获取月份的平均值

时间:2019-10-25 12:42:32

标签: python pandas

在以下数据框中,三列分别是年,月,值。我正在尝试筛选出低于某个阈值(即2007年)的年份值,然后获得分组月份的平均价值。 (即第9个月分别具有2006、2001、2006年的三个值(小于2007年),因此合计为2.9 +8 + 9)。我尝试了多种方法,但是有些不对劲。现在出现错误我得到的是“ Keu错误'year'”,我在做什么错了吗? 预先感谢

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))

1 个答案:

答案 0 :(得分:2)

首先按boolean indexing进行过滤,然后汇总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上不匹配地添加Series.reindex

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