python 中数据框中的滚动总和和平均值
Rolling sum and mean in a dataframe in python
我有这个输入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)
(抱歉,我正在学习如何在 Whosebug 中格式化 df)
我想计算最后 4 列。
在细节上,我现在需要在事件之星 "n" 跑步者 1 和跑步者 2 在他们从事件 0 到 n-1 之间加入的最后两个事件中完成的总和和平均公里数。
我觉得很有挑战性。
欢迎任何帮助。
提前致谢,
M
你写的是"rolling",其实是"very special type"
滚动计算(仅包括当前 运行 人的行
行),因此您不能使用 "pandasonic" rolling 函数。
相反,您应该以其他方式计算结果。
从预备计算开始:
生成 2 个辅助数据帧 - 运行ner 1 和 运行ner 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']
连接它们,得到 wrk DataFrame 并删除之前的 2 个 DataFrame:
wrk = pd.concat([wrk1, wrk2]).sort_values('events')
del wrk1, wrk2
然后定义以下2个函数:
获取给定 运行ner (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 返回的 Series 包含一些 float 值,
所以所有 4 个新列都被强制为 float。
要将 total 列都转换回 int,最后一步 (astype)
是需要的。
详细结果与您在 post 中所写的有些不同,
但我假设你的计算失败了(在某些情况下)。
我有这个输入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)
(抱歉,我正在学习如何在 Whosebug 中格式化 df)
我想计算最后 4 列。 在细节上,我现在需要在事件之星 "n" 跑步者 1 和跑步者 2 在他们从事件 0 到 n-1 之间加入的最后两个事件中完成的总和和平均公里数。 我觉得很有挑战性。 欢迎任何帮助。 提前致谢, M
你写的是"rolling",其实是"very special type" 滚动计算(仅包括当前 运行 人的行 行),因此您不能使用 "pandasonic" rolling 函数。 相反,您应该以其他方式计算结果。
从预备计算开始:
生成 2 个辅助数据帧 - 运行ner 1 和 运行ner 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']
连接它们,得到 wrk DataFrame 并删除之前的 2 个 DataFrame:
wrk = pd.concat([wrk1, wrk2]).sort_values('events') del wrk1, wrk2
然后定义以下2个函数:
获取给定 运行ner (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 返回的 Series 包含一些 float 值, 所以所有 4 个新列都被强制为 float。 要将 total 列都转换回 int,最后一步 (astype) 是需要的。
详细结果与您在 post 中所写的有些不同, 但我假设你的计算失败了(在某些情况下)。