Pandas:如何计算一个groupby的平均值
Pandas: How to calculate the average of a groupby
我有一个包含少量属性的 csv 文件,其中之一是不同餐厅的星级评分 etoiles
(法语中的星级)。这里annee
表示评分的年份
注意:我不知道如何在此处共享 Jupyter notebook table 输出,我尝试了不同的命令行,但格式总是很难看。如果有人可以提供帮助。
我想做的很简单(我认为)..我想添加一个新列来表示餐厅每年星级平均值的标准差。所以我必须估计每年的平均星级。然后,计算这些值的标准偏差。但是,我真的不知道使用 pandas 的语法可以让我计算一家餐厅每年的平均星级。有什么建议吗?
我知道我需要用 .groupby('restaurant_id')['annee']
按年份对餐厅进行分组,然后取当年餐厅星级的平均值,但我不知道怎么写.
# does not work
avis['newColumn'] = (
avis.groupby(['restaurant_id', 'annee'])['etoiles'].mean().std()
)
您可以通过以下方式计算每年星星平均值的标准差:
df.groupby('annes')['etoiles'].mean().std()
让我知道它是否有效。
这是一个潜在的解决方案 groupby
:
#generating test data
dates = pd.date_range('20130101', periods=36, freq='M')
year = dates.strftime('%Y')
df = pd.DataFrame([np.random.randint(1,10) for x in range(36)],columns=['Rating'])
df['restaurants'] = ['R_{}'.format(i) for i in range(4)]*9
df['date'] = dates
df['year'] = year
print(df)
rating restaurants date year
0 8 R_0 2013-01-31 2013
1 7 R_1 2013-02-28 2013
2 1 R_2 2013-03-31 2013
3 6 R_3 2013-04-30 2013
4 4 R_0 2013-05-31 2013
5 8 R_1 2013-06-30 2013
6 7 R_2 2013-07-31 2013
7 5 R_3 2013-08-31 2013
8 4 R_0 2013-09-30 2013
9 5 R_1 2013-10-31 2013
10 4 R_2 2013-11-30 2013
11 8 R_3 2013-12-31 2013
12 9 R_0 2014-01-31 2014
13 6 R_1 2014-02-28 2014
14 3 R_2 2014-03-31 2014
15 6 R_3 2014-04-30 2014
16 2 R_0 2014-05-31 2014
17 8 R_1 2014-06-30 2014
18 1 R_2 2014-07-31 2014
19 5 R_3 2014-08-31 2014
20 1 R_0 2014-09-30 2014
21 7 R_1 2014-10-31 2014
22 3 R_2 2014-11-30 2014
23 4 R_3 2014-12-31 2014
24 2 R_0 2015-01-31 2015
25 4 R_1 2015-02-28 2015
26 8 R_2 2015-03-31 2015
27 7 R_3 2015-04-30 2015
28 3 R_0 2015-05-31 2015
29 1 R_1 2015-06-30 2015
30 2 R_2 2015-07-31 2015
31 8 R_3 2015-08-31 2015
32 7 R_0 2015-09-30 2015
33 5 R_1 2015-10-31 2015
34 3 R_2 2015-11-30 2015
35 3 R_3 2015-12-31 2015
#df['date'] = pd.to_datetime(df['date']) #more versatile
#df.set_index('dates') #more versatile
#df.groupby([pd.Grouper(freq='1Y'),'restraunts'])['Rating'].mean() #more versatile
df = df.groupby(['year','restaurants']).agg({'Rating':[np.mean,np.std]})
print(df)
输出:
Rating Rating
year restaurants mean std
2013 R_0 5.333333 2.309401
R_1 6.666667 1.527525
R_2 4.000000 3.000000
R_3 6.333333 1.527525
2014 R_0 4.000000 4.358899
R_1 7.000000 1.000000
R_2 2.333333 1.154701
R_3 5.000000 1.000000
2015 R_0 4.000000 2.645751
R_1 3.333333 2.081666
R_2 4.333333 3.214550
R_3 6.000000 2.645751
编辑:
重命名列:
df.columns = ['Mean','STD']
df.reset_index(inplace=True)
year restaurant Mean STD
0 2013 R_0 1.333333 0.577350
1 2013 R_1 5.333333 3.511885
2 2013 R_2 1.333333 0.577350
3 2013 R_3 4.333333 2.886751
4 2014 R_0 3.000000 1.000000
5 2014 R_1 3.666667 2.886751
6 2014 R_2 4.333333 4.041452
7 2014 R_3 5.333333 2.081666
8 2015 R_0 6.000000 2.645751
9 2015 R_1 6.333333 3.785939
10 2015 R_2 6.333333 3.785939
11 2015 R_3 5.666667 3.055050
我有一个包含少量属性的 csv 文件,其中之一是不同餐厅的星级评分 etoiles
(法语中的星级)。这里annee
表示评分的年份
注意:我不知道如何在此处共享 Jupyter notebook table 输出,我尝试了不同的命令行,但格式总是很难看。如果有人可以提供帮助。
我想做的很简单(我认为)..我想添加一个新列来表示餐厅每年星级平均值的标准差。所以我必须估计每年的平均星级。然后,计算这些值的标准偏差。但是,我真的不知道使用 pandas 的语法可以让我计算一家餐厅每年的平均星级。有什么建议吗?
我知道我需要用 .groupby('restaurant_id')['annee']
按年份对餐厅进行分组,然后取当年餐厅星级的平均值,但我不知道怎么写.
# does not work
avis['newColumn'] = (
avis.groupby(['restaurant_id', 'annee'])['etoiles'].mean().std()
)
您可以通过以下方式计算每年星星平均值的标准差:
df.groupby('annes')['etoiles'].mean().std()
让我知道它是否有效。
这是一个潜在的解决方案 groupby
:
#generating test data
dates = pd.date_range('20130101', periods=36, freq='M')
year = dates.strftime('%Y')
df = pd.DataFrame([np.random.randint(1,10) for x in range(36)],columns=['Rating'])
df['restaurants'] = ['R_{}'.format(i) for i in range(4)]*9
df['date'] = dates
df['year'] = year
print(df)
rating restaurants date year
0 8 R_0 2013-01-31 2013
1 7 R_1 2013-02-28 2013
2 1 R_2 2013-03-31 2013
3 6 R_3 2013-04-30 2013
4 4 R_0 2013-05-31 2013
5 8 R_1 2013-06-30 2013
6 7 R_2 2013-07-31 2013
7 5 R_3 2013-08-31 2013
8 4 R_0 2013-09-30 2013
9 5 R_1 2013-10-31 2013
10 4 R_2 2013-11-30 2013
11 8 R_3 2013-12-31 2013
12 9 R_0 2014-01-31 2014
13 6 R_1 2014-02-28 2014
14 3 R_2 2014-03-31 2014
15 6 R_3 2014-04-30 2014
16 2 R_0 2014-05-31 2014
17 8 R_1 2014-06-30 2014
18 1 R_2 2014-07-31 2014
19 5 R_3 2014-08-31 2014
20 1 R_0 2014-09-30 2014
21 7 R_1 2014-10-31 2014
22 3 R_2 2014-11-30 2014
23 4 R_3 2014-12-31 2014
24 2 R_0 2015-01-31 2015
25 4 R_1 2015-02-28 2015
26 8 R_2 2015-03-31 2015
27 7 R_3 2015-04-30 2015
28 3 R_0 2015-05-31 2015
29 1 R_1 2015-06-30 2015
30 2 R_2 2015-07-31 2015
31 8 R_3 2015-08-31 2015
32 7 R_0 2015-09-30 2015
33 5 R_1 2015-10-31 2015
34 3 R_2 2015-11-30 2015
35 3 R_3 2015-12-31 2015
#df['date'] = pd.to_datetime(df['date']) #more versatile
#df.set_index('dates') #more versatile
#df.groupby([pd.Grouper(freq='1Y'),'restraunts'])['Rating'].mean() #more versatile
df = df.groupby(['year','restaurants']).agg({'Rating':[np.mean,np.std]})
print(df)
输出:
Rating Rating
year restaurants mean std
2013 R_0 5.333333 2.309401
R_1 6.666667 1.527525
R_2 4.000000 3.000000
R_3 6.333333 1.527525
2014 R_0 4.000000 4.358899
R_1 7.000000 1.000000
R_2 2.333333 1.154701
R_3 5.000000 1.000000
2015 R_0 4.000000 2.645751
R_1 3.333333 2.081666
R_2 4.333333 3.214550
R_3 6.000000 2.645751
编辑:
重命名列:
df.columns = ['Mean','STD']
df.reset_index(inplace=True)
year restaurant Mean STD
0 2013 R_0 1.333333 0.577350
1 2013 R_1 5.333333 3.511885
2 2013 R_2 1.333333 0.577350
3 2013 R_3 4.333333 2.886751
4 2014 R_0 3.000000 1.000000
5 2014 R_1 3.666667 2.886751
6 2014 R_2 4.333333 4.041452
7 2014 R_3 5.333333 2.081666
8 2015 R_0 6.000000 2.645751
9 2015 R_1 6.333333 3.785939
10 2015 R_2 6.333333 3.785939
11 2015 R_3 5.666667 3.055050