我对此感到困惑,而且-毫无特色-互联网几乎无济于事。我在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),使用类似这样的操作会删除所需的值。
使用的组合shift
和all
:
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
但是,默认情况下,它会检查列是否为all 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句