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)

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
添加回答
舉報