合并 np.equal 和 np.less 来创建单个数据框?
Combine np.equal and np.less to create single dataframe?
我有以下内容:
df1 = pd.DataFrame({'Effective_Date':pd.to_datetime(['12/31/2017', '1/31/2018', '2/28/2018', '3/31/2018', '9/30/2020']),
'Amount':[100,150,300,500,750]})
Date_Range = pd.date_range('12/31/2017', periods=150, freq='M')
我正在尝试创建一个 returns df1['Amount'] 的数据框,当 df1['Effective_Date'] 的月份 = Date_Range 的月份.但是,如果 Date_Range < df1['Effective_Date'],return 0.
例如,如果生效日期为 1/31/19,金额 = 5,则 Date_Range = 1/31/19、1/31/20、1/31/21 等为 5 . 其他地方都是 0。
我可以把两件分开做:
如果月份相等:
df2 = (pd.DataFrame(np.equal.outer(df1.Effective_Date.dt.month, Date_Range.month) * df1.Amount.values[:,None], columns = Date_Range))
如果 Date_Range < 生效日期,return 0:
df3 = (pd.DataFrame(np.less_equal.outer(df1.Effective_Date, Date_Range) * df1['Amount'].values[:,None], columns = Date_Range))
但我不确定如何将两者结合起来。感谢你的帮助。
我相信你需要numpy.where
:
a = np.equal.outer(df1.Effective_Date.dt.month, Date_Range.month) * df1.Amount.values[:,None]
b = np.less_equal.outer(df1.Effective_Date, Date_Range) * df1['Amount'].values[:,None]
m = Date_Range.values < df1['Effective_Date'].values[:,None]
df = pd.DataFrame(np.where(m, a, b), columns = Date_Range)
print (df)
2017-12-31 2018-01-31 2018-02-28 2018-03-31 2018-04-30 2018-05-31 \
0 100 100 100 100 100 100
1 0 150 150 150 150 150
2 0 0 300 300 300 300
3 0 0 0 500 500 500
4 0 0 0 0 0 0
2029-12-31 2030-01-31 2030-02-28 2030-03-31 2030-04-30 \
0 ... 100 100 100 100 100
1 ... 150 150 150 150 150
2 ... 300 300 300 300 300
3 ... 500 500 500 500 500
4 ... 750 750 750 750 750
2030-05-31
0 100
1 150
2 300
3 500
4 750
[5 rows x 150 columns]
我有以下内容:
df1 = pd.DataFrame({'Effective_Date':pd.to_datetime(['12/31/2017', '1/31/2018', '2/28/2018', '3/31/2018', '9/30/2020']),
'Amount':[100,150,300,500,750]})
Date_Range = pd.date_range('12/31/2017', periods=150, freq='M')
我正在尝试创建一个 returns df1['Amount'] 的数据框,当 df1['Effective_Date'] 的月份 = Date_Range 的月份.但是,如果 Date_Range < df1['Effective_Date'],return 0.
例如,如果生效日期为 1/31/19,金额 = 5,则 Date_Range = 1/31/19、1/31/20、1/31/21 等为 5 . 其他地方都是 0。
我可以把两件分开做:
如果月份相等:
df2 = (pd.DataFrame(np.equal.outer(df1.Effective_Date.dt.month, Date_Range.month) * df1.Amount.values[:,None], columns = Date_Range))
如果 Date_Range < 生效日期,return 0:
df3 = (pd.DataFrame(np.less_equal.outer(df1.Effective_Date, Date_Range) * df1['Amount'].values[:,None], columns = Date_Range))
但我不确定如何将两者结合起来。感谢你的帮助。
我相信你需要numpy.where
:
a = np.equal.outer(df1.Effective_Date.dt.month, Date_Range.month) * df1.Amount.values[:,None]
b = np.less_equal.outer(df1.Effective_Date, Date_Range) * df1['Amount'].values[:,None]
m = Date_Range.values < df1['Effective_Date'].values[:,None]
df = pd.DataFrame(np.where(m, a, b), columns = Date_Range)
print (df)
2017-12-31 2018-01-31 2018-02-28 2018-03-31 2018-04-30 2018-05-31 \
0 100 100 100 100 100 100
1 0 150 150 150 150 150
2 0 0 300 300 300 300
3 0 0 0 500 500 500
4 0 0 0 0 0 0
2029-12-31 2030-01-31 2030-02-28 2030-03-31 2030-04-30 \
0 ... 100 100 100 100 100
1 ... 150 150 150 150 150
2 ... 300 300 300 300 300
3 ... 500 500 500 500 500
4 ... 750 750 750 750 750
2030-05-31
0 100
1 150
2 300
3 500
4 750
[5 rows x 150 columns]