【问题标题】:Pandas reindex dates in GroupbyPandas 在 Groupby 中重新索引日期
【发布时间】:2015-08-28 16:18:25
【问题描述】:

我有一个以零星日期为索引的数据框,列 = 'id' 和 'num'。我想pd.groupby 'id' 列,并将重新索引应用于数据框中的每个组。

我的示例数据集如下所示:

            id  num
2015-08-01  1   3
2015-08-05  1   5
2015-08-06  1   4
2015-07-31  2   1
2015-08-03  2   2
2015-08-06  2   3

我对@9​​87654323@ 和ffill 的预期输出是:

            id  num
2015-08-01  1   3
2015-08-02  1   3
2015-08-03  1   3
2015-08-04  1   3
2015-08-05  1   5
2015-08-06  1   4
2015-07-31  2   1
2015-08-01  2   1
2015-08-02  2   1
2015-08-03  2   2
2015-08-04  2   2
2015-08-05  2   2
2015-08-06  2   3

我试过这个,除其他外无济于事: newdf=df.groupby('id').reindex(method='ffill') 返回错误:AttributeError: Cannot access callable attribute 'reindex' of 'DataFrameGroupBy' objects, try using the 'apply' method

任何帮助将不胜感激

【问题讨论】:

    标签: python pandas reindex


    【解决方案1】:

    可能有一种更巧妙的方法可以做到这一点,但这很有效:

    def reindex_by_date(df):
        dates = pd.date_range(df.index.min(), df.index.max())
        return df.reindex(dates).ffill()
    
    df.groupby('id').apply(reindex_by_date).reset_index(0, drop=True)
    

    【讨论】:

    • 这行得通。极好的工作。确实需要一点时间,但我无法想象有一种更快更蟒蛇的方式来做到这一点。非常感谢。
    • 一个稍微不同的风格是将函数的返回部分写成return df.resample('D').fillna(method='ffill') 。例如,如果您只需要工作日,这具有将重新采样部分中的“D”更改为“B”的额外优势(当然这取决于您想要什么)。
    • 您确定可以使用Pilik,因为我最初尝试了resample,但它没有添加缺失的日子?您也可以在pd.date_range 中实现不同的时间段,例如工作日,例如pd.date_range(.., offset='B') 工作日。
    • 这个解决方案对我不起作用:所有行都变成NaN。如果我将功能更改为使用df.reindex(dates, method = 'ffill'),它会给我TypeError: Cannot compare type 'Timestamp' with type 'str'
    • @giac_man 听起来好像您的索引中有类似日期的字符串。 DatetimIndex 看起来与包含'YYYY-MM-DD' 形式的字符串的索引相同。您可以使用pd.to_datetime 进行转换
    猜你喜欢
    • 1970-01-01
    • 2023-01-17
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2014-07-09
    相关资源
    最近更新 更多