我有一个(希望很简单(问题。我正在尝试使用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
我想填写";HoursWorkedHusFar";柱请注意,每个员工在本周开始时都是零小时工作。
在非常粗略的伪代码中,我想为HoursWorkedHusFar列做以下操作:
For Day 2 onward:
For each worker:
Add up previous day's work, plus previous day's hours worked thus far
因此,HoursWorkedHusFar列应填写为:
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 pd
df = 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)
如有任何建议,不胜感激。
谢谢!
尝试使用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)
我们通过每个
"Worker"
分别调用数据帧和groupby
我们得到
["HoursWorked"]
系列来准备计算运行和我们调用
cumsum()
方法来获得正在运行的总
我想这就是您想要的。不过,您需要先将列转换为数字类型。
df['HoursWorked'] = df['HoursWorked'].astype(float)
df['HoursWorkedThusFar'] = df.groupby('Worker')['HoursWorked'].transform(lambda x: x.cumsum().shift().fillna(0))