pandas 基于未按预期工作的日期的累计和

f0brbegy  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(168)

我每天的目标是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
c86crjj0

c86crjj01#

我有一个不太优雅的解决方案,但它对我很有效。

idx = df[df['col3'] >= 250].groupby('col1').head(1).index
df.loc[idx, 'col4'] = 1
df['col4']=df['col3']*df['col4']
df['col4'] = df.groupby('col1')['col4'].ffill()
df['col4']=df['col4'].fillna(df['col3']).astype('int')

相关问题