首页 > 解决方案 > 基于另一个数据框将值从一列滚动到另一列

问题描述

我有两个数据框: 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相应月份内的第一个数据帧中的值填充值(例如,我取A3from的最后一个值2018-05并将其放入 .IF 的2018-05-31DF2中该 ID 没有其他值,只需DF使用最右侧填充列中的值填充所有剩余列(向右滚动)。

所以最终的结果就是这样

ID  2018-01-31 2018-02-28 2018-03-31 2018-04-30 2018-05-31 2018-06-30 2018-07-31
A1  8500        8500        8500      8500        8500        8500         8500
A2   NA         1900        1900      1900        1900        1900         1900
A3   NA          NA          NA       3000        110           0             0
A4   NA          NA          NA        NA         NA           10            10
A5   NA          NA          NA        NA         NA           NA           500

标签: pythonpandasdataframe

解决方案


这为您提供以下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

推荐阅读