R语言如何按分组计算数据框指定行的价格与成交量平均值
实现方案
下面是两种主流数据分析工具的简便实现方式,你之前用head仅返回第一个分组结果,是因为没有将计算逻辑作用到每个分组的独立上下文里,按下方写法即可得到目标结构的结果:
Python Pandas 实现
import pandas as pd # 假设原始数据框命名为 df stat_result = df.groupby('Stock').apply( lambda group: pd.Series({ 'Pr/3D/Avg': group[group['Day'] <= 3]['Price'].mean(), 'Pr/5D/Avg': group[group['Day'] <= 5]['Price'].mean(), 'Pr/20D/Avg': group[(group['Day'] >=5) & (group['Day'] <=25)]['Price'].mean(), 'Vo/3D/Avg': group[group['Day'] <= 3]['Volume'].mean(), 'Vo/5D/Avg': group[group['Day'] <= 5]['Volume'].mean(), 'Vo/20D/Avg': group[(group['Day'] >=5) & (group['Day'] <=25)]['Volume'].mean() }) ).reset_index()
如果每个股票分组的Day已经按升序排好,还可以用位置索引优化性能:
stat_result = df.groupby('Stock').apply( lambda group: pd.Series({ 'Pr/3D/Avg': group['Price'].head(3).mean(), 'Pr/5D/Avg': group['Price'].head(5).mean(), 'Pr/20D/Avg': group['Price'].iloc[4:].mean(), # 索引从0开始,第4位对应第5天 'Vo/3D/Avg': group['Volume'].head(3).mean(), 'Vo/5D/Avg': group['Volume'].head(5).mean(), 'Vo/20D/Avg': group['Volume'].iloc[4:].mean() }) ).reset_index()
R dplyr 实现
library(dplyr) # 假设原始数据框命名为 df stat_result <- df %>% group_by(Stock) %>% summarise( `Pr/3D/Avg` = mean(Price[Day <= 3]), `Pr/5D/Avg` = mean(Price[Day <= 5]), `Pr/20D/Avg` = mean(Price[Day >=5 & Day <=25]), `Vo/3D/Avg` = mean(Volume[Day <= 3]), `Vo/5D/Avg` = mean(Volume[Day <= 5]), `Vo/20D/Avg` = mean(Volume[Day >=5 & Day <=25]) )
内容的提问来源于stack exchange,提问作者kartheek sista
相关产品推荐
相关产品推荐

