python - Pandas groupby - 按列值扩展平均值

标签 python pandas

我是 Pandas 新手,有点不知道在这里要做什么。我有一个从 csv 导入的数据框,它(大大简化)如下所示:

date = ['2013-08-10','2013-08-10','2013-08-10','2013-08-10','2013-08-10',
        '2013-08-10','2013-08-10','2013-08-10','2013-08-10','2013-08-10']
event = ['213','213','213','213','214','214','214','215','215','215']
side = ['A','B','B','B','A','B','A','B','A','B',]
value = [0.193,0.193,0.092,0.027,0.027,0.058,0.027,0.079,0.193,0.159]

df = pd.DataFrame(zip(event,date,side,value),
                  columns=['event','date','side','value'])

  event        date side  value
0   213  2013-08-10    A  0.193
1   213  2013-08-10    B  0.193
2   213  2013-08-10    B  0.092
3   213  2013-08-10    B  0.027
4   214  2013-08-10    A  0.027
5   214  2013-08-10    B  0.058
6   214  2013-08-10    A  0.027
7   215  2013-08-10    B  0.079
8   215  2013-08-10    A  0.193
9   215  2013-08-10    B  0.159

我想要的是对每个事件的每一侧对应的值进行求和。这是我通过 groupby 实现的:

groupby = df.groupby(['event','side']).sum()

            value
event side       
213   A     0.193
      B     0.312
214   A     0.054
      B     0.058
215   A     0.193
      B     0.238

但我还想添加一个新列,其中每一侧的均值都扩展,如下所示:

            value
event side          roll_mean
213   A     0.193   0
      B     0.312   0
214   A     0.054   0.193
      B     0.058   0.312
215   A     0.193   0.124
      B     0.238   0.185

请注意,每个事件都有两侧,但并不总是 A 和 B。我想要的是类似于 excel 的mean.if 函数,它计算当前侧所有值的扩展平均值,应用于所有先前的行。对此的任何帮助将不胜感激。

最佳答案

我认为您实际上正在寻找扩展平均值,而不是滚动平均值。扩展均值考虑每个先前的值。我将从您上次停下的地方开始:

In [63]: res = df.groupby(['event','side']).sum()
In [64]: res
Out[64]: 
            value
event side       
213   A     0.193
      B     0.312
214   A     0.054
      B     0.058
215   A     0.193
      B     0.238

现在我们要按 side 进行分组并采用扩展平均值:

In [65]: res['expanding_mean'] = res.groupby(level='side').apply(pd.expanding_mean).shift(2)
In [66]: res
Out[66]: 
            value  expanding_mean
event side                       
213   A     0.193             NaN
      B     0.312             NaN
214   A     0.054          0.1930
      B     0.058          0.3120
215   A     0.193          0.1235
      B     0.238          0.1850

您的结果需要平移2,因为您希望平均值包含所有之前的结果,而不是当前的结果(确保这是您实际的结果)想要,这似乎有点搞笑)。您可以将 shift(2) 替换为 len(res.index.levels[1]),以使其更加通用,以防您有超过 2 条边。

关于python - Pandas groupby - 按列值扩展平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25917287/

相关文章:

python - 如何将 JSON 数据转换为树形图像?

python - 如何连接两个 ID 不匹配的数据帧并创建新列来表示数据帧 ID 的来源?

python - 无法使用 np 数组中的 dtype 将字符串转换为 float

python - web2py 重定向到上一页

Python - 不使用复制模块的深度复制

python - 汇总 DataFrame 行和列

python - Pandas :从行中的每个元素中减去行均值

python - 获取 Pandas 日期时间索引的先前值

python - 向不退出的行添加值

python - 选择与键对应的字典值