我有一个问题(希望很简单)。我正在尝试使用 Pandas 在 Python 中创建运行总计。假设我有一些工人,他们每天都会记录他们的工作时间。我想知道每天报告的到目前为止他们工作的总小时数。假设我有一个 Pandas 数据框,有四列,如下所示(在日期之间添加水平空间以便于阅读): Day Worker HoursWorked HoursWorkedThusFar 1 1 0 0 1 2 2 0 1 3 4 0 2 1 6 0 2 2 8 0 2 3 10 0 3 1 12 0 3 2 14 0 3 3 16 0我想填写“HoursWorkedThusFar”栏。请注意,每个工人在一周开始时的工作时间为零。在非常粗略的伪代码中,我想对 HoursWorkedThusFar 列执行以下操作:For Day 2 onward: For each worker: Add up previous day's work, plus previous day's hours worked thus far因此,HoursWorkedThusFar 列应填写为: Day Worker HoursWorked HoursWorkedThusFar 1 1 0 0 (Initial Value) 1 2 2 0 (Initial Value) 1 3 4 0 (Initial Value) 2 1 6 0 (0+0) 2 2 8 2 (0+2) 2 3 10 4 (0+4) 3 1 12 6 (0+6) 3 2 14 10 (2+8) 3 3 16 14 (4+10)以下是生成该示例初始数据帧的代码:import pandas as pddf = pd.DataFrame(columns=('Day', 'Worker', 'HoursWorked', 'HoursWorkedThusFar'))for i in range(3): df.loc[i] = [1, i + 1, i*2, 0]for i in range(3,6): df.loc[i] = [2, i - 2, i*2, 0]for i in range (6,9): df.loc[i] = [3, i - 5, i*2, 0]print(df)非常感谢任何建议。
2 回答
![?](http://img1.sycdn.imooc.com/545868330001e54e02200220-100-100.jpg)
桃花长相依
TA贡献1860条经验 获得超8个赞
尝试使用pd.Series.cumsum()
生成运行总计
# Ordering data by worker and converting to numeric for application of running total df["HoursWorked"]=df["HoursWorked"].astype(float) df["HoursThusFar"] = df.groupby("Worker").cumsum()
分解它
我们创建df["HoursThusFar"]
变量并执行以下操作:
我们将其转换
["HoursWorked"]
为astype(float)
我们将数据框和
groupby
每个数据框称为"Worker"
我们让
["HoursWorked"]
序列准备好计算运行总和我们调用
cumsum()
方法来获取运行总计
![?](http://img1.sycdn.imooc.com/54584f8f00019fc002200220-100-100.jpg)
胡子哥哥
TA贡献1825条经验 获得超6个赞
我想这就是你要找的。不过,您需要首先将列转换为数字类型。
df['HoursWorked'] = df['HoursWorked'].astype(float) df['HoursWorkedThusFar'] = df.groupby('Worker')['HoursWorked'].transform(lambda x: x.cumsum().shift().fillna(0))
添加回答
举报
0/150
提交
取消