我有以下Pandas数据框:
import pandas as pd
df= pd.DataFrame({'type':['Asset','Liability','Asset','Liability','Asset'],'Amount':[10,-10,20,-20,5],'Maturity Date':['2018-01-22','2018-01-22','2018-06-22','2018-06-22','2019-01-22']})
根据用户输入,我想修改Pandas数据框以仅显示某些值。对于" date" 2018-01-31,我希望数据框为:
df1= pd.DataFrame({'2018-01-31':[0,0,20,-20,5],'type':['Asset','Liability','Asset','Liability','Asset'],'Amount':[10,-10,20,-20,5],'Maturity Date':['2018-01-22','2018-01-22','2018-06-22','2018-06-22','2019-01-22']})
类似于" date" 2018-12-31,我希望数据框为:
df2= pd.DataFrame({'2018-12-31':[0,0,0,0,5],'2018-01-31':[0,0,20,-20,5],'type':['Asset','Liability','Asset','Liability','Asset'],'Amount':[10,-10,20,-20,5],'Maturity Date':['2018-01-22','2018-01-22','2018-06-22','2018-06-22','2019-01-22']})
有关实现此目标的最有效方法的任何建议吗?
答案 0 :(得分:3)
用户输入日期,然后我们可以基于此
获得它df['2018-12-31']=(df['Maturity Date']>pd.to_datetime('2018-12-31'))*df.Amount
df
Out[356]:
Amount Maturity Date type 2018-12-31
0 10 2018-01-22 Asset 0
1 -10 2018-01-22 Liability 0
2 20 2018-06-22 Asset 0
3 -20 2018-06-22 Liability 0
4 5 2019-01-22 Asset 5
使用 np.where
+ df.insert
的其他解决方案
date = '2018-01-31'
df.insert(0, date, np.where(df['Maturity Date'] > '2018-01-31', df.Amount, 0))
df
2018-01-31 Amount Maturity Date type
0 0 10 2018-01-22 Asset
1 0 -10 2018-01-22 Liability
2 20 20 2018-06-22 Asset
3 -20 -20 2018-06-22 Liability
4 5 5 2019-01-22 Asset
答案 1 :(得分:1)
让我们使用assign
和mask
:
print(df)
Amount Maturity Date type
0 10 2018-01-22 Asset
1 -10 2018-01-22 Liability
2 20 2018-06-22 Asset
3 -20 2018-06-22 Liability
4 5 2019-01-22 Asset
添加,第一列,
input_date = '2018-01-31'
df = df.assign(input_date=df.Amount.mask(df["Maturity Date"] <= input_date,0)).rename(columns={'input_date':input_date})
print(df)
Amount Maturity Date type 2018-01-31
0 10 2018-01-22 Asset 0
1 -10 2018-01-22 Liability 0
2 20 2018-06-22 Asset 20
3 -20 2018-06-22 Liability -20
4 5 2019-01-22 Asset 5
添加,第二列,
input_date = '2018-12-31'
df = df.assign(input_date=df.Amount.mask(df["Maturity Date"] <= input_date,0)).rename(columns={'input_date':input_date})
print(df)
Amount Maturity Date type 2018-01-31 2018-12-31
0 10 2018-01-22 Asset 0 0
1 -10 2018-01-22 Liability 0 0
2 20 2018-06-22 Asset 20 0
3 -20 2018-06-22 Liability -20 0
4 5 2019-01-22 Asset 5 5