使用带多个条件的.cumsum()逐行累加值

2024-09-30 18:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我想用来在名为df的数据帧中迭代的列表值示例

np_checkList = np.array(['ALPHA', 'BETA', 'CHARLIE','DELTA'])

这是一个数据帧示例,我想使用np_检查表中的值对“NAME”列进行循环

df = pd.DataFrame(np.array([['ALPHA',2,'BUY'],
                            ['BETA',5,'BUY'],
                            ['CHARLIE',3,'BUY'],
                            ['CHARLIE',5,'BUY'],
                            ['DELTA',11,'BUY'],
                            ['ALPHA', 2,'BUY'],
                            ['CHARLIE',8,'SELL']]),
                   columns=['NAME','AMOUNT','TYPE'])

下面是我通过对“NAME”条件下每行的“AMOUNT”值进行累积求和而获得的最终结果。例如,如果“NAME”列的值是ALPHA,而“TYPE”是“BUY”,那么代码将对每一行进行累加

在“累计”列下,第1行的“ALPHA”值为2,第6行的“ALPHA”值为4

      NAME  AMOUNT  TYPE ACCUMULATE
0    ALPHA       2   BUY          2
1     BETA       5   BUY          5
2  CHARLIE       3   BUY          3
3  CHARLIE       5   BUY          8
4    DELTA      11   BUY         11
5    ALPHA       2   BUY          4
6  CHARLIE       8  SELL           

我用下面这组代码得到了上面的结果

我的代码往往比较冗长,这是因为我接受了来自C代码编写的老学校培训。要知道python有很多可用的API,可以用更少的行来实现结果。我有两个问题需要寻求指导,以深入探讨解决问题的各种方法

问题1:我如何将.cumsum()与'NAME'中的值一起使用键入“列”作为条件来执行“金额”值的累积和,并在“累积”列中更新它们

问题2:我在运行下面的代码后收到此警告。 我可以知道是什么原因引起的以及如何解决此警告吗

SettingWithCopyWarning:试图在数据帧切片的副本上设置值 请参阅文档中的注意事项:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy self.\u setitem\u单个块(索引器、值、名称)

df["AMOUNT"] = pd.to_numeric(df["AMOUNT"])

cumulativeValue = 0
newAccumulation = []
df['ACCUMULATE'] = ''

for name in np_checkList:
    cumulativeValue = 0
    for counter, row in df.iterrows():
            if (row['NAME'] == name) & (row['TYPE'] == 'BUY'):
                cumulativeValue = cumulativeValue + df.loc[counter]['AMOUNT']
                df.ACCUMULATE.iloc[counter] = cumulativeValue
df

Tags: 数据代码namealphadftypenpcounter
1条回答
网友
1楼 · 发布于 2024-09-30 18:22:29

试试这个:

df['AMOUNT'] = df['AMOUNT'].astype(int)
df.loc[df['NAME'].isin(np_checkList) & df['TYPE'].eq('BUY'), 'ACCUMULATE'] = df['AMOUNT']
df['ACCUMULATE'] = df.groupby('NAME')['ACCUMULATE'].cumsum()
print(df)

输出:

      NAME  AMOUNT  TYPE  ACCUMULATE
0    ALPHA       2   BUY         2.0
1     BETA       5   BUY         5.0
2  CHARLIE       3   BUY         3.0
3  CHARLIE       5   BUY         8.0
4    DELTA      11   BUY        11.0
5    ALPHA       2   BUY         4.0
6  CHARLIE       8  SELL         NaN

相关问题 更多 >