亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有條件 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條經驗 獲得超6個贊

嘿希望這會給你一個提示:

首先,我對代表費用的行動給出否定符號。

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 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號