我有一个数据框中的四列数据,如下所示:
A B C D
75472 d1 x -36.0 0.0
75555 d2 x -38.0 0.0
75638 d3 x -18.0 0.0
75721 d4 x -18.0 1836.0
75804 d5 x 1151.0 0.0
75887 d6 x 734.0 0.0
75970 d7 x -723.0 0.0
我想要根据以下条件对D
进行条件求和:
- 如果D有值,则使用D的值
- 否则,将前一行的D值加上C的值作为D的值
因此,在上述情况下,D应为[-36,-74,-92,1836,2987,3721,2998]
。
我已成功使用for循环实现此操作。
for i, row in me.iterrows():
try:
if row['D'] > 0:
step1 = me.loc[(me['B'] == row['B']) & (me['A'] == row['A']), 'output'].iloc[0]
me_copy.iloc[i, me_copy.columns.get_loc('output')] = step1
else:
step1 = me.loc[(me['B'] == row['B']) & (me['A'] == (row['A'] - pd.DateOffset(days=1))), 'step1'].iloc[0]
receipts_adjustments_sales = me.loc[(me['B'] == row['B']) & (me['A'] == row['A']), 'C'].iloc[0]
me_copy.iloc[i, me_copy.columns.get_loc('output')] = step1 + receipts_adjustments_sales
except:
me_copy.iloc[i, me_copy.columns.get_loc('output')] = 0
但是for循环明显非常耗费资源,是一种反模式,并且基本上无法运行整个数据框。我试图复制一个在数据面板上编写的excel函数,但我始终无法弄清如何使用以下方法:
pd.Series.shift()
pd.Series.rolling()
- 仅计算不同列的值
我曾经尝试使用shift()
来实现,但我意识到我不得不为每一行创建一个单独的列,这就是我选择使用for循环的原因。
通用于分组
df.loc[:, 'A_group'] = df.groupby(['A'])[df['D'] != 0].cumsum()
df.loc[:, 'E'] = df['D'].mask(df['D'] == 0).combine_first(df['C'])
df.loc[:, 'F'] = me.groupby(['A', 'A_group'])['E'].cumsum()
感谢Scott Boston提供的帮助!
grp
语句以使用A和B创建你想要的组。 - Scott Bostongrp = df.groupby(['A', 'B', df['D'] > 0]).cumsum() df['step1'].mask(df['step1'] == 0).combine_first(df['receipts_adjustments_sales']).groupby(grp).cumsum()
? - gr1zzly be4r