这是我想要用于在名为df的数据帧中迭代的列表值示例。
np_checkList = np.array(['ALPHA', 'BETA', 'CHARLIE','DELTA'])
这是我想使用np_checklist中的值对列'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”条件下的每一行的“总量”值进行累计总和而获得的最终结果。例如,如果'NAME‘列值为ALPHA,'TYPE’为'BUY',则代码将对每一行进行累计求和。
导致值为2的“ALPHA”的第一行和“累积”列下值为4的“ALPHA”的第6行。
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”&“TYPE”列中的值一起用作条件,以执行“”值的累积和,并在“累积”列中更新这些值?
问题2:在运行下面的代码后有此警告。我可以知道是什么原因造成的,以及如何解决这个警告吗?
SettingWithCopyWarning:一个值试图设置在DataFrame的一个切片的副本上--参见文档中的注意事项: self._setitem_single_block(索引器、值、名称)
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
发布于 2021-08-22 02:58:13
试试这个:
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
https://stackoverflow.com/questions/68880597
复制