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

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

基于Flag的Python DataFrame累加器

基于Flag的Python DataFrame累加器

一只甜甜圈 2021-09-28 13:25:52
我有一個邏輯驅動的標志列,我需要創建一個列,當標志為真時增加 1,當標志為假時減少 1 到零下限。我嘗試了幾種不同的方法,但無法讓累加器“移位”來引用流程創建的新值。我知道下面的方法無論如何都不會止步于零,但我之前只是試圖解決這個概念,這是解釋目標的最切中要害的例子。我是否需要 for 循環來逐行迭代?df = pd.DataFrame(data=np.random.randint(2,size=10), columns=['flag'])df['accum'] = 0df['accum'] = np.where(df['flag'] == 1, df['accum'].shift(1) + 1, df['accum'].shift(1) - 1)df['dOutput'] = [1,0,1,2,1,2,3,2,1,0] #desired outputdf
查看完整描述

1 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

據我所知,沒有numpy或熊貓矢量化操作可以做到這一點,因此,您應該逐行迭代:


def cumsum_with_floor(series):

    acc = 0

    output = []

    accum_list = []

    for val in series:

        val = 1 if val else -1

        acc += val

        accum_list.append(val)

        acc = acc if acc > 0 else 0

        output.append(acc)

    return pd.Series(output, index=series.index), pd.Series(accum_list, index=series.index)


series = pd.Series([1,0,1,1,0,0,0,1])

dOutput, accum = cumsum_with_floor(series)


dOutput

Out:

0    1

1    0

2    1

3    2

4    1

5    0

6    0

7    1

dtype: int64


accum  # shifted by one step forward compared with you example

Out: 

0    1

1   -1

2    1

3    1

4   -1

5   -1

6   -1

7    1

dtype: int64

但是可能有人知道pd.clip和/pd.cumsum或其他矢量化操作的合適組合。


查看完整回答
反對 回復 2021-09-28
  • 1 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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