首页 > 解决方案 > Pandas DataFrame 中的前导和尾随填充日期

问题描述

这是我的数据框:


df = pd.DataFrame.from_records(data=data, coerce_float=False, index=['date'])
# date field a datetime.datetime values

            account_id  amount
date                          
2018-01-01           1   100.0
2018-01-01           1    50.0
2018-06-01           1   200.0
2018-07-01           2   100.0
2018-10-01           2   200.0

问题描述

如何用前导和尾随“空日期”“填充”我的数据框。我试图在 date_range 和 period_range 上重新索引,我试图合并另一个索引。我一整天都在尝试各种事情,并且阅读了很多文档。

我有一个简单的数据框,其中包含transaction_datetransaction_amounttransaction_account. 我想对这个数据框进行分组,以便在第一级按帐户分组,然后按年分组,然后按月分组。然后我想要每个月的一列,其中包含sum该月的交易金额值。

这似乎应该是很容易做到的事情。

预期产出

这是我得到的最接近的:


df = pd.DataFrame.from_records(data=data, coerce_float=False, index=['date'])
df = df.groupby(['account_id', df.index.year, df.index.month])
df = df.resample('M').sum().fillna(0)

print(df)
                                                          account_id  amount
account_id date   date       date                          
1                 2018       1       2018-01-31           2   150.0
                             6       2018-06-30           1   200.0
2                 2018       7       2018-07-31           2   100.0
                            10       2018-10-31           2   200.0

这就是我想要实现的(基本上通过重新索引数据date_range(start='2018-01-01', period=12, freq='M')

(理想情况下,我希望月份按年份在顶部作为列转置)

                                            amount
account_id        Year        Month
1                 2018           1        150.0
                                 2         NaN
                                 3         NaN
                                 4         NaN
                                 5         NaN
                                 6        200.0
                                 ....
                                 12      200.0
2                 2018           1          NaN
                                 ....
                                 7        100.0
                                 ....
                                 10        200.0
                                 ....
                                 12        NaN

标签: pythonpandasdataframe

解决方案


一种方法是reindex

s=df.groupby([df['account_id'],df.index.year,df.index.month]).sum()
idx=pd.MultiIndex.from_product([s.index.levels[0],s.index.levels[1],list(range(1,13))])
s=s.reindex(idx)
s
Out[287]: 
           amount
1 2018 1    150.0
       2      NaN
       3      NaN
       4      NaN
       5      NaN
       6    200.0
       7      NaN
       8      NaN
       9      NaN
       10     NaN
       11     NaN
       12     NaN
2 2018 1      NaN
       2      NaN
       3      NaN
       4      NaN
       5      NaN
       6      NaN
       7    100.0
       8      NaN
       9      NaN
       10   200.0
       11     NaN
       12     NaN

推荐阅读