【问题标题】:Pandas: Converting timeseries of values to tracking changes in valuePandas:将值的时间序列转换为跟踪值的变化
【发布时间】:2014-08-10 04:40:27
【问题描述】:

我对此感到困惑,而且 - 一反常态 - 互联网几乎没有帮助。我在 Pandas 工作,但我觉得这对于旨在有效存储时间序列数据的人来说一定是一个普遍的问题。

我有很多标准的每日时间序列数据,其中的值很少发生变化,如下所示:

Date Value 01/02/2014 .1 01/03/2014 .1 01/04/2014 .5 01/05/2014 .5 01/06/2014 .5 01/07/2014 .1

我会将数据转换为仅跟踪值更改的日期,因此上面的示例现在应该如下所示:

Date Value 01/02/2014 .1 01/04/2014 .5 01/07/2014 .1

不幸的是,使用 drop_duplicates() 之类的东西会在值恢复为先前值的情况下删除所需的值(例如上面示例中的 .1)。

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    使用shiftall 的组合:

    In [98]:
    
    import io
    temp = """Date,Value
    01/02/2014,.1
    01/03/2014,.1
    01/04/2014,.5
    01/05/2014,.5
    01/06/2014,.5
    01/07/2014,.1"""
    df = pd.read_csv(io.StringIO(temp))
    df
    Out[98]:
             Date  Value
    0  01/02/2014    0.1
    1  01/03/2014    0.1
    2  01/04/2014    0.5
    3  01/05/2014    0.5
    4  01/06/2014    0.5
    5  01/07/2014    0.1
    
    In [99]:
    
    df.loc[(df.shift() != df).all(axis=1)]
    Out[99]:
             Date  Value
    0  01/02/2014    0.1
    2  01/04/2014    0.5
    5  01/07/2014    0.1
    

    在这里,我们将移位(1 行)的数据帧与原始数据帧进行比较,然后我们想要比较每一列并使用all 并传递axis=1 来实现这一点。

    进一步细分,如果我们看看 df.shift() != df 返回的内容:

    In [100]:
    
    df.shift() != df
    Out[100]:
       Date  Value
    0  True   True
    1  True  False
    2  True   True
    3  True  False
    4  True  False
    5  True   True
    

    我们得到一个带有布尔值的数据框,但我们不能将其用作掩码,我们想检查所有行是否为True,因此我们使用all

    In [101]:
    
    (df.shift() != df).all()
    Out[101]:
    Date      True
    Value    False
    dtype: bool
    

    但是,默认情况下它会检查列是否都是True,我们要检查行值所以我们传递axis=1

    In [102]:
    
    (df.shift() != df).all(axis=1)
    Out[102]:
    0     True
    1    False
    2     True
    3    False
    4    False
    5     True
    dtype: bool
    

    我们现在可以使用它作为布尔掩码来实现我们想要的:

    In [103]:
    
    df.loc[(df.shift() != df).all(axis=1)]
    Out[103]:
             Date  Value
    0  01/02/2014    0.1
    2  01/04/2014    0.5
    5  01/07/2014    0.1
    

    【讨论】:

    • hmm...虽然我们将其添加到了食谱中(可能还有某个地方的主要文档)。想这样做吗?一个完整的例子
    • @Jeff 很高兴,这只是指向此答案的链接吗?
    • 我认为一个小的完整示例会很好(我发现内联代码更适合一个小示例)
    • @Jeff 我需要下载源代码并编译它吗:pandas.pydata.org/… 不确定我是否会遇到问题,因为我使用的是 python 附带的 WinPython
    • @Jeff 谢谢你的链接,我会试一试,看看我是怎么做的,我想贡献更多,而不仅仅是我对 SO 的基本答案
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2019-01-17
    • 2013-06-07
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多