我有这个输入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
你写的是 "滚动",但事实上这是一种 "非常特殊的 "滚动计算(只包括当前行的选手行),所以你不能使用 "pandasonic"。滚动 函数,而不是用其他方式计算结果。
从准备计算开始。
生成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']
把它们连接起来,得到 劳动 DataFrame,并删除之前的2个DataFrames。
wrk = pd.concat([wrk1, wrk2]).sort_values('events')
del wrk1, wrk2
然后定义以下两个函数:
获取给定亚军的统计量(总和和平均值) (rnr),从给定事件前的最后2个事件(ev):
def getStat(rnr, ev):
res = wrk.query('Runner == @rnr and events < @ev').dist.iloc[-2:]
return res.sum(), res.mean()
获取当前行的附加列。
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个新列都被强制为 浮动.要转换两个 总 列回 昵,最后一步(虾型)是需要的。
详细的结果和你帖子里写的有点不一样,但我认为你的计算失败了(在某些情况下)。