Python 使用Pandas运行引用多列的总计

Python 使用Pandas运行引用多列的总计,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个(希望很简单)问题。我正在尝试使用Pandas在Python中创建一个运行总数。假设我有工人,他们每天都在跟踪他们的工作时间。我想知道到目前为止,他们每天工作的总小时数 假设我有一个Pandas数据框,有四列,如下所示(为便于阅读,在几天之间添加了水平空间): 我想填写“工作小时数”一栏。请注意,每个工人在开始一周的工作时间为零小时 在非常粗略的psuedocode中,我想对HoursWorkedTusFar列执行以下操作: For Day 2 onward: For each

我有一个(希望很简单)问题。我正在尝试使用Pandas在Python中创建一个运行总数。假设我有工人,他们每天都在跟踪他们的工作时间。我想知道到目前为止,他们每天工作的总小时数

假设我有一个Pandas数据框,有四列,如下所示(为便于阅读,在几天之间添加了水平空间):

我想填写“工作小时数”一栏。请注意,每个工人在开始一周的工作时间为零小时

在非常粗略的psuedocode中,我想对HoursWorkedTusFar列执行以下操作:

For Day 2 onward:
    For each worker:
        Add up previous day's work, plus previous day's hours worked thus far
因此,列HoursWorkedTusFar应填写为:

  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)
任何建议都将不胜感激


谢谢

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

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


df['HoursWorkedThusFar'] = df.groupby('Worker')['HoursWorked'].transform(lambda x: x.cumsum().shift().fillna(0))
尝试使用生成运行总计

# 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”]
变量并执行以下操作:

  • 我们将
    [“工作小时数”]
    转换为
    astype(float)

  • 我们将数据帧和
    groupby
    分别称为
    “Worker”

  • 我们得到
    [“HoursWorked”]
    系列,以便准备计算运行总和

  • 我们调用
    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[“HoursWorkedTusFar”]=np.where(df['Day']>1,df.groupby(“Worker”)['HoursWorked']].cumsum(),0)将此应用于第2天以后的情况。我编辑了我的提交,将每个组的cumsum输出向下移动一个,然后用0填充空格以获得您想要的内容。这几乎奏效了!我认为需要指定“HoursWorked”列才能正常工作,否则Pandas不知道应该总结哪个列。请参阅我在另一篇帖子上的评论,了解我是如何应用你的两个建议的。