Python 基于现有列中的条件在dataframe中创建新列

Python 基于现有列中的条件在dataframe中创建新列,python,pandas,dataframe,loops,if-statement,Python,Pandas,Dataframe,Loops,If Statement,我有以下数据: dict1={“code”:[3,3,3,1,1,2,2,3,3,3],“Num”:[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 我想创建一个新列(End Balance),其值

我有以下数据:

dict1={“code”:[3,3,3,1,1,2,2,3,3,3],“Num”:[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
我想创建一个新列(End Balance),其值基于现有的Code和Num列

如果代码值为1,则结束余额等于Num

如果代码为2,则结束余额值是代码为2的Num值之和

如果代码为3,则结束余额值是代码为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

这个输出的问题是,在代码=3的第二个子集,End_Balance列开始求和,同时考虑到代码为3的第一个子集。你可以很容易地看到这一点。 我希望脚本中的mylist2在第一个子集Code=3之后被删除,当新的子集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,我可以做我想做的事情,但这里我需要一个iErrors解决方案。

IIUC,+

或:

您还可以使用:

印刷品:

   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
df['End_balance'] = df['Num'].where(df['Code'].eq(1),
                                    df.groupby(blocks)['Num'].cumsum())
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
df1['End_Balance'] = np.where(df1.Code == 1, df1.Num, df1.groupby((df1.Code != df1.Code.shift(1)).cumsum())['Num'].transform('cumsum') )
print(df1)
   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