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