使用Pandas运行引用多列的合计



我有一个(希望很简单(问题。我正在尝试使用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"]变量并执行以下操作:

  1. 我们将["HoursWorked"]转换为astype(float)

  2. 我们通过每个"Worker"分别调用数据帧和groupby

  3. 我们得到["HoursWorked"]系列来准备计算运行和

  4. 我们调用cumsum()方法来获得正在运行的总

我想这就是您想要的。不过,您需要先将列转换为数字类型。

df['HoursWorked'] = df['HoursWorked'].astype(float)

df['HoursWorkedThusFar'] = df.groupby('Worker')['HoursWorked'].transform(lambda x: x.cumsum().shift().fillna(0))

最新更新