我有下表,其中“排名”和“大米”列作为 pandas 中的数据框。
我想对第一个正大米列数的结果列进行求和。如果当前大米 col 为正且高于该值也为正,则也忽略总和。
Outcome col 是需要的结果。
Rank rice Outcome
1.00 -41.05
2.00 763.1 722.05
3.00 -702.1
4.00 -96.35
5.00 -670.1
6.00 -699.6
7.00 -642.1
8.00 -31.05
9.00 -69.15
10.00 -49.15
11.00 -539.3
12.00 -30.35
13.00 -530.1
14.00 569.1 -133
15.00 -600.1
16.00 601.1 1
17.00 620.1
18.00 -46.65
19.00 -615.2
20.00 -581.8
21.00 -562.8
22.00 538.2 491.55
23.00 79.85
24.00 -582.3
25.00 -615.1
26.00 22.85 102.7
27.00 -583.5
28.00 -578.1
我正在使用以下代码。
import pandas as pd
data = [['1',-41.05],['2',763.1],['3',-702.1],['4',-96.35],['5',-670.1],['6',-699.6],['7',-642.1],['8',-31.05],['9',-69.15],['10',-49.15],['11',-539.3],['12',-30.35],['13',-530.1],['14',569.1],['15',-600.1],['16',601.1],['17',620.1],['18',-46.65],['19',-615.2],['20',-581.8],['21',-562.8],['22',538.2],['23',79.85],['24',-582.3],['25',-615.1],['26',22.85],['27',-583.5],['28',-578.1]]
df=pd.DataFrame(data, columns=['Rank', 'rice'])
df.loc[df['rice'] >0 , 'outcome'] = df['rice']-df['rice'].shift()
然而,结果并不符合预期的结果。请帮忙。
491.55 或 102.7 中都有不符合逻辑的地方。
groupby.transform
。我提供两种选择(如果您想忽略或不忽略连续的正值):
m = df['rice'].gt(0)
m2 = (m&~m.shift(fill_value=False))
df.loc[m2, 'Outcome'] = (df['rice']
#.mask(m&~m2)
.groupby(m2[::-1].cumsum())
.transform('first').add(df['rice'])
)
输出(Outcome2 带有未注释的
.mask(m&~m2)
):
Rank rice Outcome Outcome2
0 1 -41.05 NaN NaN
1 2 763.10 722.05 722.05
2 3 -702.10 NaN NaN
3 4 -96.35 NaN NaN
4 5 -670.10 NaN NaN
5 6 -699.60 NaN NaN
6 7 -642.10 NaN NaN
7 8 -31.05 NaN NaN
8 9 -69.15 NaN NaN
9 10 -49.15 NaN NaN
10 11 -539.30 NaN NaN
11 12 -30.35 NaN NaN
12 13 -530.10 NaN NaN
13 14 569.10 -133.00 -133.00
14 15 -600.10 NaN NaN
15 16 601.10 1.00 1.00
16 17 620.10 NaN NaN
17 18 -46.65 NaN NaN
18 19 -615.20 NaN NaN
19 20 -581.80 NaN NaN
20 21 -562.80 NaN NaN
21 22 538.20 1158.30 491.55
22 23 79.85 NaN NaN
23 24 -582.30 NaN NaN
24 25 -615.10 NaN NaN
25 26 22.85 102.70 -559.45
26 27 -583.50 NaN NaN
27 28 -578.10 NaN NaN