I have a dataframe and I would like to get summing values for every [group] with one row Values before (‘subtract’ & ‘add’) and one row after (‘BEGUZE_UE’) the group. (A group can contain different strings, UE_1 doesn’t matter).
But I get some wrong results in ‘m_days’. Thanks for any help.
DataFrame:
data = {'ATEXT': ['', 'CT', 'RT', '', '', '', '', 'CT', 'CT', 'CT', 'RT', '', '', '', 'CTS', 'CT',
'', 'CT', 'RT', 'RT', 'RT', 'CT', '', 'CT', 'RT', 'RT', '', '', 'CT', '', ''],
'BEGUZ_UE': [11.00, 23.00, 33.00, 15.00, 12.75, 19.75, 14.75, 23.00, 24.00, 24.00, 33.00, 15.00, 14.25, 13.00,
23.00, 24.00, 11.00, 23.00, 33.00, 24.00, 24.00, 24.00, 6.00, 23.00, 33.00, 24.00, 10.68,
21.00, 23.00, 12.75, 13.00],
'subtract': [00.00, 00.00, 00.00, 00.00, 00.00, 3.57, 00.00, 00.00, 00.00, 00.00, 00.00, 00.08, 00.00, 00.00,
00.00, 00.00, 00.00, 00.00, 00.00, 00.00, 00.00, 00.00, 00.00, 00.00, 00.00, 00.00, 00.00,
6.08, 00.00, 00.00, 00.00],
'add': [3.92, 00.00, 00.00, 00.00, 4.95, 00.00, 2.95, 00.00, 00.00, 00.00, 00.00, 00.00, 2.62, 1.92, 00.00,
00.00, 3.92, 00.00, 00.00, 00.00, 00.00, 00.00, 12.00, 00.00, 00.00, 00.00, 2.95, 00.00, 00.00, 4.95,
1.92],
'UE_1': ['', '', '', '', 12.67, 24.7, 11.18, '', '', '', '', '', 14.17, 15.62, '', '',
'', '', '', '', '', '', '', '', '', '', '', 23.95, '', '', 17.95]}
df = pd.DataFrame(data)
df
Used Code:
m = df['ATEXT'].eq("")
cond = (~m) & m.shift(-1)
df['UE_more_days'] = (df['BEGUZ_UE'].mask(m)
.groupby(m.cumsum()).cumsum()
.where(cond)
).shift() # orginal ohne shift() hier
tmv = (df[['subtract', 'add']]
.shift()
.groupby(m.cumsum())
.transform('max')
.eval('add-subtract')
)
df['m_days'] = (df.groupby(m[::-1].cumsum())['BEGUZ_UE']
.transform('sum')
.add(tmv)
.where(cond)
.shift()
)
Result:
ATEXT BEGUZ_UE subtract add UE_1 UE_more_days m_days
0 11.00 [-0.00 +3.92 NaN NaN
1 CT 23.00 0.00 0.00 NaN NaN
2 RT 33.00 0.00 0.00 NaN NaN
3 +15.00] 0.00 0.00 56.0 74.92 ok
4 12.75 0.00 4.95 12.67 NaN NaN
5 19.75 3.57 0.00 24.7 NaN NaN
6 14.75 [-0.00 +2.95 11.18 NaN NaN
7 CT 23.00 0.00 0.00 NaN NaN
8 CT 24.00 0.00 0.00 NaN NaN
9 CT 24.00 0.00 0.00 NaN NaN
10 RT 33.00 0.00 0.00 NaN NaN
11 +15.00] 0.08 0.00 104.0 118.38 shold be 121.95
12 14.25 0.00 2.62 14.17 NaN NaN
13 13.00 [-0.00 +1.92 15.62 NaN NaN
14 CTS 23.00 0.00 0.00 NaN NaN
15 CT 24.00 0.00 0.00 NaN NaN
16 +11.00] [-0.00 +3.92 47.0 60.62 should be 59.92
17 CT 23.00 0.00 0.00 NaN NaN
18 RT 33.00 0.00 0.00 NaN NaN
19 RT 24.00 0.00 0.00 NaN NaN
20 RT 24.00 0.00 0.00 NaN NaN
21 CT 24.00 0.00 0.00 NaN NaN
22 + 6.00] [-0.00 +12.00 128.0 137.92 ok
23 CT 23.00 0.00 0.00 NaN NaN
24 RT 33.00 0.00 0.00 NaN NaN
25 RT 24.00 0.00 0.00 NaN NaN
26 +10.68] 0.00 2.95 80.0 102.68 ok
27 21.00 [-6.08 +0.00 23.95 NaN NaN
28 CT 23.00 0.00 0.00 NaN NaN
29 +12.75] 0.00 4.95 23.0 32.62 shold be 29.67
30 13.00 0.00 1.92 17.95 NaN NaN