gpt4 book ai didi

python - 计算所有部门列的累计和

转载 作者:行者123 更新时间:2023-12-04 15:20:41 27 4
gpt4 key购买 nike

我有这个数据框

lst = [['AA','Z',10,1,0],['BB','Y',10,1,0],
['AA','Z',20,2,0],['CC','X',10,2,0]]
df1 = pd.DataFrame(lst,columns = ['first_name','last_name','val','department','is_cum'])

看起来像这样

  first_name last_name  val  department  is_cum
0 AA Z 10 1 NO
1 BB Y 10 1 NO
2 AA Z 20 2 NO
3 CC X 10 2 NO

我想要这样的输出

  first_name last_name  val  department  is_cum
0 AA Z 10 1 NO
1 BB Y 10 1 NO
2 AA Z 10 1 YES
3 BB Y 10 1 YES

4 AA Z 20 2 NO
5 CC X 10 2 NO
6 AA Z 30 1,2 YES
7 CC X 10 2 YES
8 BB Y 10 1 YES

所有 is_cum 为 NO 的行与输入数据帧相同,新填充的行是 is_cum 为 YES 的累积行。

第 2 行和第 3 行与第 0 行和第 1 行相同,因为我们只有一个 department 可以进行累积。第 6、7、8 行是 department 1 和 department 2 的累加。如果我们有相同的 first_namelast_name 在部门 1 和部门 2 中添加 val 或保持原样。

我在做

df1.groupby(['first_name','last_name','department']).sum().groupby(level=0).cumsum()

在此之后,我可以更改 is_cum col 并将这些行附加到原始数据框中。但这不是所需的输出。

最佳答案

这是一种使用 pivot_table 来沿着列执行累积和的方法。其余的几乎都获得了预期的输出。

df_ = (df1.assign(dpt=df1['department'], 
department=df1['department'].astype(str))\
.pivot_table(index=['first_name','last_name'], columns='dpt',
values=['val', 'department'],
aggfunc={'val':sum,'department':lambda x: list(x)})
.assign(val=lambda x: x['val'].cumsum(axis=1).ffill(axis=1),
department=lambda x: x['department'].apply(lambda x: x.dropna().cumsum(), axis=1)
.ffill(axis=1))
)

res= (pd.concat([df1.assign(is_cum='NO', dpt=df1['department']),
df_.stack().reset_index()
.assign(is_cum='YES',
department=lambda x: x['department'].apply(','.join))])
.sort_values(['dpt', 'is_cum']).drop('dpt',axis=1)
.reset_index(drop=True)
)

你得到

print(res)
first_name last_name val department is_cum
0 AA Z 10.0 1 NO
1 BB Y 10.0 1 NO
2 AA Z 10.0 1 YES
3 BB Y 10.0 1 YES
4 AA Z 20.0 2 NO
5 CC X 10.0 2 NO
6 AA Z 30.0 1,2 YES
7 BB Y 10.0 1 YES
8 CC X 10.0 2 YES

关于python - 计算所有部门列的累计和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63383460/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com