我有两个数据框:
DF1
ID DatePaid Remaining
A1 2018-01-01 8500
A2 2018-02-15 2000
A2 2018-02-28 1900
A3 2018-04-12 3000
A3 2018-05-12 2700
A3 2018-05-17 110
A3 2018-06-17 0
A4 2018-06-18 10
A5 2018-07-13 500
现在我有另一个数据框DF2
,该数据框仅具有第一个数据框的唯一ID,并且日期表示月份:
ID 2018-01-31 2018-02-28 2018-03-31 2018-04-30 2018-05-31 2018-06-30 2018-07-31
A1
A2
A3
A4
A5
因此,基于第一个数据帧,我需要基于相应月份内第一个数据帧中的Remaining
值填充值(例如,我取{{1} },然后将其放在A3
的{{1}}列中,如果没有该ID的其他值,只需将2018-05
中的所有其余列填充为最右边填充的列(向右滚动)。
所以最终结果就是这样
2018-05-31
答案 0 :(得分:2)
这将以df2
的形式为您提供数据:
month_ends = pd.to_datetime(df1.DatePaid).dt.to_period('M')
# also
# month_ends = pd.to_datetime(df1.DatePaid).add(pd.offsets.MonthEnd(0))
(df1.groupby(['ID', month_ends])
['Remaining'].last()
.unstack(-1)
.ffill(1)
.reset_index()
.rename_axis(columns=None)
)
输出:
ID 2018-01 2018-02 2018-04 2018-05 2018-06 2018-07
0 A1 8500.0 8500.0 8500.0 8500.0 8500.0 8500.0
1 A2 NaN 1900.0 1900.0 1900.0 1900.0 1900.0
2 A3 NaN NaN 3000.0 110.0 0.0 0.0
3 A4 NaN NaN NaN NaN 10.0 10.0
4 A5 NaN NaN NaN NaN NaN 500.0
答案 1 :(得分:0)
这是我的方法。
df_ = df.pivot_table(index='ID', columns='DatePaid', values='Remaining').fillna(method='ffill',axis=1)