在Python中对数据框中的和值和均值进行滚动。

问题描述 投票:-1回答:1

我有这个输入df

import pandas as pd
df = pd.DataFrame([[0,'B','A',1,0], [1,'B','C',0,0], [2,'A','B',3,2],[3,'A','B',5,2],[4,'A','C',2,1],[5,'B','A',0,1],[6,'C','B',5,5]], columns=['events','Runner 1','Runner 2','dist_R1','dist_R2'])
print(df)

我想再添加4个滚动计算列,如下图。

import pandas as pd

df = pd.DataFrame([[0,'B','A',1,0,0,0,0,0], [1,'B','C',0,0,1,0,1,0], [2,'A','B',3,2,0,1,0,0.5],[3,'A','B',5,2,3,3,2,1],[4,'A','C',2,1,8,0,2.67,0],[5,'B','A',0,1,5,10,1.25,2.5],[6,'C','B',5,5,1,5,0.5,1]], columns=['events','Runner 1','Runner 2','dist_R1','dist_R2','sum_dist_last_2_by_R1','sum dist last 2 by R2','mean dist last 2 by R1','mean dist last 2 by R2'])
print(df)

(抱歉,我正在StackOverflow学习如何格式化一个df)

我想计算最后4列.在细节上,我需要现在在事件的明星 "n "的总和和平均公里,亚军1和亚军2完成在过去的两个事件,他们加入了从事件0到n-1主机之间.我认为是相当具有挑战性的.任何帮助是欢迎的.提前感谢,M

python pandas pandas-groupby rolling-computation
1个回答
0
投票

你写的是 "滚动",但事实上这是一种 "非常特殊的 "滚动计算(只包括当前行的选手行),所以你不能使用 "pandasonic"。滚动 函数,而不是用其他方式计算结果。

从准备计算开始。

  1. 生成2个辅助的DataFrames -- 跑者1和跑者2的结果。

    wrk1 = df[['events', 'Runner 1', 'dist_R1']]
    wrk1.columns = ['events', 'Runner', 'dist']
    wrk2 = df[['events', 'Runner 2', 'dist_R2']]
    wrk2.columns = ['events', 'Runner', 'dist']
    
  2. 把它们连接起来,得到 劳动 DataFrame,并删除之前的2个DataFrames。

    wrk = pd.concat([wrk1, wrk2]).sort_values('events')
    del wrk1, wrk2
    

然后定义以下两个函数:

  1. 获取给定亚军的统计量(总和和平均值) (rnr),从给定事件前的最后2个事件(ev):

    def getStat(rnr, ev):
        res = wrk.query('Runner == @rnr and events < @ev').dist.iloc[-2:]
        return res.sum(), res.mean()
    
  2. 获取当前行的附加列。

    def getAddCols(row):
        td_r1, md_r1 = getStat(row['Runner 1'], row.events)
        td_r2, md_r2 = getStat(row['Runner 2'], row.events)
        return pd.Series([td_r1, td_r2, md_r1, md_r2],
            index=['tot dist_R1', 'tot dist_R2', 'mean dist_R1', 'mean dist_R2'])
    

然后得到结果,运行。

df.join(df.apply(getAddCols, axis=1).fillna(0))\
    .astype({'tot dist_R1': int, 'tot dist_R2': int})

注意,一个 系列 所回 getAddCols 包含一些 浮动 值,所以所有4个新列都被强制为 浮动.要转换两个 列回 ,最后一步(虾型)是需要的。

详细的结果和你帖子里写的有点不一样,但我认为你的计算失败了(在某些情况下)。

© www.soinside.com 2019 - 2024. All rights reserved.