gpt4 book ai didi

python - 根据现有列中的条件在数据框中创建新列

转载 作者:行者123 更新时间:2023-12-05 09:07:44 24 4
gpt4 key购买 nike

我有以下数据:

dict1={"代码":[3,3,3,1,1,2,2,3,3,3],"数字":[10,10,5,5,5, 5,10,5,25,25]}

df1=pd.DataFrame(dict1)

结果是:

   Code Num
0 3 10
1 3 10
2 3 5
3 1 5
4 1 5
5 2 5
6 2 10
7 3 5
8 3 25
9 3 25

我想创建一个新列(期末余额),其值基于现有的代码和数字列。

如果Code值为1则End Balance等于Num

如果 Code 为 2,则 End Balance 值为 Code 为 2 的 Num 值的总和

如果 Code 为 3,则 End Balance 值为 Code 为 3 的 Num 值之和

我使用 iterrows 并且我有以下脚本:

mylist1=[]
mylist2=[]
for index, row in df1.iterrows():
if row["Code"]==1:
end_balance=row["Num"]
elif row["Code"]==2:
mylist1.append(row["Num"])
end_balance=sum(mylist1)
elif row["Code"]==3:
mylist2.append(row["Num"])
end_balance=sum(mylist2)
df1.loc[index,"End_Balance"]=end_balance

输出是什么

   Code Num End_Balance
0 3 10 10.00
1 3 10 20.00
2 3 5 25.00
3 1 5 5.00
4 1 5 5.00
5 2 5 5.00
6 2 10 15.00
7 3 5 30.00
8 3 25 55.00
9 3 25 80.00

此输出的问题是,在 Code = 3 的第二个子集中,End_Balance 列开始求和,同时考虑到 Code 为 3 的第一个子集。您可以很容易地看到这一点。我想以某种方式在 Code=3 的第一个子集之后删除脚本中的 mylist2,并且当 Code=3 的新子集出现时,End_Balance 列中的总和应该重新开始。预期输出是:

   Code Num End_Balance
0 3 10 10.00
1 3 10 20.00
2 3 5 25.00
3 1 5 5.00
4 1 5 5.00
5 2 5 5.00
6 2 10 15.00
7 3 5 5.00
8 3 25 30.00
9 3 25 55.00

希望您的建议遵循相同的逻辑 - 使用 iterrows。我知道可能使用 groupby 我可以做我想做的事,但在这里我需要一个带有 iterrows 的解决方案。

最佳答案

您还可以使用 np.select :

In [2062]: import numpy as np

In [2063]: conditions = [df1.Code.eq(1), df1.Code.eq(2) | df1.Code.eq(3)]
In [2061]: choices = [df1.Num, df1.groupby((df1.Code != df1.Code.shift()).cumsum())['Num'].cumsum()]

In [2065]: df1['End_Balance'] = np.select(conditions, choices)

In [2066]: df1
Out[2066]:
Code Num End_Balance
0 3 10 10
1 3 10 20
2 3 5 25
3 1 5 5
4 1 5 5
5 2 5 5
6 2 10 15
7 3 5 5
8 3 25 30
9 3 25 55

关于python - 根据现有列中的条件在数据框中创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64527745/

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