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

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

如果列值大于其他值,如何在Python中創建累積和列

如果列值大于其他值,如何在Python中創建累積和列

紫衣仙女 2023-09-26 14:04:03
我現在正在使用 pandas 獲取累積總和列。但是,僅當其他列值大于其他列值時,該列才最多包含累積和。這是我當前數據的示例:Index     A       B       C0         1       20      31         10      15      112         20      12      253         30      18      324         40      32      175         50      12      4然后,如果B列大于C ,我想要Acumsum()列,否則值為零。原始結果D列應如下所示:dfIndex     A       B       C      D0         1       20      3      11         10      15      11     112         20      12      25     03         30      18      32     04         40      32      17     405         50      12      4      90我感謝您提前提供的任何支持。
查看完整描述

3 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

df = pd.DataFrame({'A': {0: 1, 1: 10, 2: 20, 3: 30, 4: 40, 5: 50},

? ? ? ? ? ? ? ? ? ?'B': {0: 20, 1: 15, 2: 12, 3: 18, 4: 32, 5: 12},

? ? ? ? ? ? ? ? ? ?'C': {0: 3, 1: 11, 2: 25, 3: 32, 4: 17, 5: 4}})

為您的條件創建一個布爾系列并識別連續的 True 或 False 組


b_gt_c = df.B > df.C

groups = b_gt_c.ne(b_gt_c.shift()).cumsum()


In [107]: b_gt_c

Out[107]:?

0? ? ?True

1? ? ?True

2? ? False

3? ? False

4? ? ?True

5? ? ?True

dtype: bool


In [108]: groups

Out[108]:?

0? ? 1

1? ? 1

2? ? 2

3? ? 2

4? ? 3

5? ? 3

dtype: int32

按這些組分組;將每組的總和乘以條件;將結果分配給新的 df 列。


gb = df.groupby(groups)

for k,g in gb:

? ? df.loc[g.index,'D'] = g['A'].cumsum() * b_gt_c[g.index]


In [109]: df

Out[109]:?

? ? A? ?B? ?C? ? ?D

0? ?1? 20? ?3? ?1.0

1? 10? 15? 11? 11.0

2? 20? 12? 25? ?0.0

3? 30? 18? 32? ?0.0

4? 40? 32? 17? 40.0

5? 50? 12? ?4? 90.0

您也可以跳過 for 循環:


df['G'] = np.where(df.B.gt(df.C), df.A, np.NaN)

group = df.B.gt(df.C).ne(df.B.gt(df.C).shift()).cumsum()

df['G'] = df.groupby(group).G.cumsum().fillna(0)

查看完整回答
反對 回復 2023-09-26
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

可能有更優雅的解決方案,但這也有效。


我們首先創建兩個虛擬列 - x 和 x_shift。


df.x 是有條件的,我們保留 df.A 的值,其中 df.B > df.C。


df.x_shift 是我們將值移到下面一行并用 0 填充 na 的地方。


在最后一步中,我們有條件地添加 df.A 和 df.x_shift,然后刪除 df.x 和 df.x_shift


df['x'] = pd.DataFrame(np.where(df.B>df.C, df.A ,0))

df['x_shift'] = df.x.shift(1).fillna(0)

df['D'] = pd.DataFrame(np.where(df.B >df.C, df.A+df.x_shift,0))

df= df.drop(['x','x_shift'], axis=1


查看完整回答
反對 回復 2023-09-26
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

雖然這有點野蠻,但您可以轉換為 numpy 數組,然后編寫一個簡單的 catch 來遍歷 3 個數組并比較值。



查看完整回答
反對 回復 2023-09-26
  • 3 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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