我每天的目标是250。对于任何给定日期,如果cum-daily_result已达到250,则后续行的预期结果应仅为250
输入表格:
col1 col2 col3
0 a 250 250
1 a 250 500
2 a -1290 -790
3 b -1392 -1392
4 b 250 -1142
5 b 250 -892
6 b 2238 1346
7 b 250 1596
8 c 2477 2477
9 c -3813 -1336
10 c 250 -1086
如果我使用下面的代码,如果第一行col 3以正值开始,则输出是正确的
代码:
idx = df[df['col3'] >= 250].groupby('col1').head(1).index
df.loc[idx, 'col4'] = 1
df['col4'] = df.groupby('col1')['col4'].bfill() * df['col3']
df['col4'] = df.groupby('col1')['col4'].ffill().astype('int')
输出:
col1 col2 col3 col4
0 a 250 250 250
1 a 250 500 250
2 a -1290 -790 250
3 b -1392 -1392 -1392
4 b 250 -1142 -1142
5 b 250 -892 -892
6 b 2238 1346 1346
7 b 250 1596 1346
8 c 2477 2477 2477
9 c -3813 -1336 2477
10 c 250 -1086 2477
但是,如果第一行col 3为负,或者特定col 1的所有行(例如“a”)为负,则此方法无效。
下面是输入的例子,上面的代码没有给予想要的结果
col1 col2 col3
0 a -500 -500
1 a -250 -750
2 a -1000 -1750
3 b -1392 -1392
4 b 250 -1142
5 b 250 -892
6 b 2238 1346
7 b 250 1596
8 c 2477 2477
9 c -3813 -1336
10 c 250 -1086
预期输出如下所示
col1 col2 col3 col4
0 a -500 -500 -500
1 a -250 -750 -750
2 a -1000 -1750 -1750
3 b -1392 -1392 -1392
4 b 250 -1142 -1142
5 b 250 -892 -892
6 b 2238 1346 1346
7 b 250 1596 1346
8 c 2477 2477 2477
9 c -3813 -1336 2477
10 c 250 -1086 2477
1条答案
按热度按时间c86crjj01#
我有一个不太优雅的解决方案,但它对我很有效。