根据日期列和事务的更改将行复制到新数据框
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
我已经检查了几个网站和 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