使用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
但是,默认情况下它会检查列是否都是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