根据日期列和事务的更改将行复制到新数据框

Copy rows to new dataframe based on change in date column and transaction

我已经检查了几个网站和 Whosebug,但找不到任何文档或有关此主题的帮助,因此希望社区中的某个人可能知道答案。 我有一份杂货清单、数量、交易(B 代表买入,S 代表卖出)和日期 purchased/sold:

TRANSACTIONS    Qty Transaction Date
Apple   5   B   1/1/22
Banana  5   B   1/1/22
Cereal  3   B   1/1/22
Milk    4   B   1/1/22
Banana  2   S   2/2/22
Milk    1   S   2/2/22
Toy     4   B   2/2/22

我想做的是生成一个新的数据框,其中包含交易以显示基于交易的剩余数量以及每个交易日期:

BALANCE Qty Date
Apple   5   1/1/22
Banana  5   1/1/22
Cereal  3   1/1/22
Milk    4   1/1/22
Apple   5   2/2/22
Banana  3   2/2/22
Cereal  3   2/2/22
Milk    3   2/2/22
Toy     4   2/2/22

这是一个one-liner解决方案(格式化):

new_df = (
    df.pivot(index='TRANSACTIONS', columns='Date')
    .pipe(lambda x: x.assign(Qty=x.Qty.fillna(0), Transaction=x.Transaction.ffill(axis=1)))
    .stack()
    .sort_index(level=1)
    .reset_index()
    .dropna()
    .pipe(lambda x: x.assign(Qty=x['Qty'].where(x['Transaction'] == 'B', -x['Qty'])))
    .pipe(lambda x: x.assign(Qty=x.groupby('TRANSACTIONS')['Qty'].cumsum().astype(int)))
    .drop(['Transaction'], axis=1)
    .rename({'TRANSACTIONS': 'BALANCE'}, axis=1)
)

输出:

>>> new_df
  BALANCE    Date  Qty
0   Apple  1/1/22    5
1  Banana  1/1/22    5
2  Cereal  1/1/22    3
3    Milk  1/1/22    4
5   Apple  2/2/22    5
6  Banana  2/2/22    3
7  Cereal  2/2/22    3
8    Milk  2/2/22    3
9     Toy  2/2/22    4