基于日期的Pandas数据框中的条件值

时间:2018-01-10 16:53:16

标签: python-3.x pandas

我有以下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']})

有关实现此目标的最有效方法的任何建议吗?

2 个答案:

答案 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)

让我们使用assignmask

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