【发布时间】:2021-05-30 16:58:23
【问题描述】:
我有一个数据集如下:
import pandas as pd
data = {'Category': ['A','A','A','A','A','A','B','B','B','B','B','C','C','C','C','C'],
'Date' : [1,2,3,4,5,6,1,2,3,4,5,1,2,3,4,5],
'Count': [1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,6]}
df = pd.DataFrame(data)
我试图计算每3行的平均计数,不包括按类别分组的当前行,日期从新到旧,如果没有足够的3行计算,它将返回0。
预期的结果应该如下。 例如:对于日期 1 的类别 A,平均值计算为类别 A 的日期 2、3 和 4 的平均计数。
| Category | Date | Count | Average |
|---|---|---|---|
| A | 1 | 1 | 3 |
| A | 2 | 2 | 4 |
| A | 3 | 3 | 3.333333333 |
| A | 4 | 4 | 2.666666666 |
| A | 5 | 5 | 0 |
| A | 6 | 1 | 0 |
| B | 1 | 2 | 4 |
| B | 2 | 3 | 5 |
| B | 3 | 4 | 0 |
| B | 4 | 5 | 0 |
| B | 5 | 6 | 0 |
| C | 1 | 1 | 3 |
| C | 2 | 2 | 4.333333333 |
| C | 3 | 3 | 0 |
| C | 4 | 4 | 0 |
| C | 5 | 6 | 0 |
我尝试在下面使用,但没有得到预期的结果
df['average'] = df.groupby(['Category'])['count'].transform(lambda x: x.rolling(3, 1).mean())
【问题讨论】:
-
第 4 行(A 类中的
2.666666667)的平均值应该为 0,对吗?否则它看起来与 B 和 C 不一致。 -
@Shaido 应该是 2.66667,如果要计算的行数少于 3,则返回 0。
-
那么,请解释一下如何得到 2.666。如果您只使用 2 行,您将拥有 (5+1)/2=3。还有为什么 B 和 C 类别有 3 个零?
标签: python pandas group-by pandas-groupby rolling-computation