熊猫:将值的时间序列转换为跟踪值的变化

Sim*_*onR 4 python time-series pandas

我一直对此感到困惑 - 一反常态 - 互联网一直没什么帮助.我在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)的情况下删除所需的值.

EdC*_*ica 5

使用的组合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
Run Code Online (Sandbox Code Playgroud)

在这里,我们将移位(乘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
Run Code Online (Sandbox Code Playgroud)

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

In [101]:

(df.shift() != df).all()
Out[101]:
Date      True
Value    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

但是,默认情况下它会检查列是否全部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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)