【问题标题】:Leading and Trailing Padding Dates in Pandas DataFramePandas DataFrame 中的前导和尾随填充日期
【发布时间】:2019-03-22 22:01:12
【问题描述】:

这是我的数据框:


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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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
    

    【讨论】:

    • 有没有办法避免使用list(range(1,13)而继续使用pandas时间序列函数? (因为我可能需要填充数据多年)。我的意思是,它有效,只是看起来不正确......:S
    • @coler-j 因为一年只有 12 个月......我的事情是一样的
    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 2021-11-07
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2014-10-11
    • 2014-09-25
    相关资源
    最近更新 更多