根据另一数据框将值从一列滚动到另一列

时间:2020-02-28 16:15:12

标签: python pandas dataframe

我有两个数据框: 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

2 个答案:

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