在以下数据框中,三列分别是年,月,值。我正在尝试筛选出低于某个阈值(即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))
答案 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