【发布时间】:2021-10-17 18:39:51
【问题描述】:
我想问一下如何在 pandas 数据框中找到特定列值的累积平均值。 首先,数据如下所示:
| firm | date | reviewer | rate |
|---|---|---|---|
| A | 2021-01-01 | a | 5 |
| A | 2021-01-01 | b | 1 |
| A | 2021-01-01 | c | 2 |
| A | 2021-01-02 | d | 3 |
| A | 2021-01-02 | e | 4 |
| A | 2021-01-03 | f | 3 |
| A | 2021-01-04 | g | 5 |
| B | 2021-01-01 | h | 5 |
| B | 2021-01-01 | i | 2 |
| B | 2021-01-02 | j | 3 |
| B | 2021-01-02 | k | 4 |
| B | 2021-01-03 | a | 3 |
| B | 2021-01-04 | b | 5 |
我要查找的是按日期获取特定公司的平均评分,并添加一列以查找累积平均评分,包括今天的平均评分。
我想把它做成如下图所示的数据框。
| firm | date | reviewer | rate | cum_avg_rate |
|---|---|---|---|---|
| A | 2021-01-01 | a | 5 | 2.667 |
| A | 2021-01-01 | b | 1 | 2.667 |
| A | 2021-01-01 | c | 2 | 2.667 |
| A | 2021-01-02 | d | 3 | 3 |
| A | 2021-01-02 | e | 4 | 3 |
| A | 2021-01-03 | f | 3 | 3 |
| A | 2021-01-04 | g | 5 | 3.286 |
| B | 2021-01-01 | h | 5 | 3.5 |
| B | 2021-01-01 | i | 2 | 3.5 |
| B | 2021-01-02 | j | 3 | 3.5 |
| B | 2021-01-02 | k | 4 | 3.5 |
| B | 2021-01-03 | a | 3 | 3.4 |
| B | 2021-01-04 | b | 5 | 3.667 |
到目前为止我尝试过的方法是创建一个新的数据框,使用带有公司和日期的 'groupby' 方法计算平均分数和评论数量,并使用它来创建每天的累积平均值。
代码如下。
firm_gp=avg_mean_rate.groupby(['firm','date'])['mean']
firm_gp_count=avg_mean_rate.groupby(['firm','date'])['count']
avg_mean_rate['new_avg_grade']=( (firm_gp * firm_gp_count).cumsum())/firm_gp_count.cumsum()
但是,问题是在计算每一天的累积平均值的过程中出现了以下错误。
TypeError: unsupported operand type(s) for *: 'SeriesGroupBy' and 'method'
作为第二种方法,我使用numpy尝试了以下方法。
def w_cum_avg(avg_mean_rate,mean,count):
d=avg_mean_rate['mean']
w= avg_mean_rate['count']
return(d*w).cumsum() / w.cumsum()
avg_mean_rate.groupby(['firm','date']).apply(w_cum_avg,'mean','count')
但这并不好用,正如我所料。
如果您能教我如何获得结果,我将不胜感激。
提前谢谢你。
【问题讨论】:
-
使用
avg_mean_rate.groupby(['firm','date'])['rate'].mean()代替avg_mean_rate.groupby(['firm','date'])['mean']需要指定聚合哪一列,需要调用聚合方法。
标签: python pandas dataframe weighted-average