【问题标题】:How to add multiple date rows at once in dataframe python如何在数据框python中一次添加多个日期行
【发布时间】:2020-01-06 10:52:37
【问题描述】:

我有一个包含日期索引、销售列和商店编号列的数据框。我想为缺少销售数据的商店填写缺失的销售值。

例如,假设我想用下面商店 10 的年度平均销售额来填充缺失的销售额值。假设我拥有的 2015 年商店 10 的销售数据是:

Sales| Store Number| Date
4000 |      10     | 2015-01-01
6000 |      10     | 2015-01-02
10000|      10     | 2016-01-01

如果这是我拥有的 2015 年商店 10 的唯一销售数据,那么我想创建 363 个新行,对应于日期 2015-01-03 到 2015-12-31,平均销售额为 mean( 4000,6000)=5000。我怎样才能有效地做到这一点?

【问题讨论】:

    标签: python pandas date time-series


    【解决方案1】:

    这可以通过reindex 来获取每个商店的所有日期 + fillna 来用平均销售额替换缺失的日期。

    import pandas as pd
    #df['Date'] = pd.to_datetime(df['Date'])
    
    idx = pd.MultiIndex.from_product(
            [df['Store Number'].unique(),
             pd.date_range(f'{df.Date.dt.year.min()}-01-01', 
                           f'{df.Date.dt.year.max()}-12-31', freq='D')])
    
    df = df.set_index(['Store Number', 'Date']).reindex(idx)
    
    # Mean per year by store. 
    s = df.groupby([df.index.get_level_values(0), 
                    df.index.get_level_values(1).year]).transform('mean')
    
    df['Sales'] = df[['Sales']].fillna(s)
    

    打印(df)

    #                Sales
    #10 2015-01-01   4000.0
    #   2015-01-02   6000.0
    #   2015-01-03   5000.0
    #   2015-01-04   5000.0
    #   2015-01-05   5000.0
    #...                ...
    #   2016-12-27  10000.0
    #   2016-12-28  10000.0
    #   2016-12-29  10000.0
    #   2016-12-30  10000.0
    #   2016-12-31  10000.0
    #[731 rows x 1 columns]
    

    因为reindex 超过了笛卡尔积,我们可以处理从未有任何销售的商店并在事后放弃它们,而不是慢慢地重新索引每个组。

    m = (df['Sales'].isnull()
           .groupby([df.index.get_level_values(0), 
                     df.index.get_level_values(1).year]).transform('all'))
    
    df = df.loc[~m]
    

    【讨论】:

      【解决方案2】:
      1. 您必须通过groupby Year 和 Store Number 根据当前数据集查找平均销售额。
      2. 然后估算到年底的剩余天数的平均销售额。

      这个编码应该相当简单..

      【讨论】:

        猜你喜欢
        • 2020-03-18
        • 2017-07-19
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        • 2020-09-13
        • 1970-01-01
        相关资源
        最近更新 更多