Pandas DataFrame中的填充日期的前导和尾随

时间:2019-03-22 22:01:13

标签: python 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

1 个答案:

答案 0 :(得分:1)

一种方法是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