为了账号安全,请及时绑定邮箱和手机立即绑定

具有条件 cumsum 的自定义聚合

具有条件 cumsum 的自定义聚合

牛魔王的故事 2022-06-14 17:25:55
我有一个看起来像这样的数据框根据用户操作(可能有四种操作),我想在给定时间点累积用户的金额。A 类和 B 类行为代表用户收入,C 类和 D 类行为代表用户支出。换句话说,我想要这样的结果用户 1 首先执行 action_A 并得到 10 作为结果。然后 action_B 给我们 10 + 5 = 15。Action_C 代表金钱损失,给 use 15 - 5 = 10。最后,action_D 与 C 相同,我们得到 10 - 15 = -5。我怎样才能用熊猫实现这个?我尝试使用自定义聚合expanding().apply(agg_func)但没有得到任何令人满意的结果。编辑:数据框创建代码ids = [1,1,1,1,2,2]dates = ['2019-03-07 13:54', '2019-03-07 16:07', '2019-03-10 19:20', '2019-03-10 19:20', '2016-03-07 14:47', '2016-03-09 11:07']amounts = [10., 5., 5., 15., 2., 4.]actions = ['action_A', 'action_B', 'action_C', 'action_D', 'action_A', 'action_B']result = [10, 15, 10, -5, 2, 6]pd.DataFrame({'user_id': ids, 'start_date': dates, 'amount': amounts, 'action': actions, 'result': result}, index=range(6))
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

由和最后使用-1创建的掩码的多个值:Series.isinSeries.maskGroupBy.cumsum


df['result'] = (df['amount'].mask(df['action'].isin(['action_C','action_D']),

                                  df['amount'] * -1)

                           .groupby(df['user'])

                           .cumsum())

print (df['result'])

0    10.0

1    15.0

2    10.0

3    -5.0

4     2.0

5     6.0

Name: result, dtype: float64

与帮助列类似的解决方案:


df['result'] = (df.assign(tmp = df['amount'].mask(df['action'].isin(['action_C','action_D']),

                                 df['amount']*-1))

                  .groupby('user')['tmp']

                  .cumsum())


查看完整回答
反对 回复 2022-06-14
?
ibeautiful

TA贡献1993条经验 获得超5个赞

嘿希望这会给你一个提示:

首先,我对代表费用的行动给出否定符号。

df.loc[df.action.isin(['action_C','action_D'])].amount = -1 * df.loc[df.action.isin(['action_C','action_D'])].amount

然后你像这样创建结果列

df['result'] = df.amount.cumsum()


查看完整回答
反对 回复 2022-06-14
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号