只保留DataFrame中连续重复的行中的第一行

5

假设我有一个只有一列数据的DataFrame。例如:

np.random.random_integers(0,2,1000)
data = np.cumsum(np.random.random_integers(0,2,1000))
idx = pd.date_range('1-1-2001', freq='D', periods=1000)
df = pd.DataFrame(data, idx)

我希望能够仅返回与上一行不同的行,而不是使用完整的DataFrame。

因此,这样做:

2001-01-20   21
2001-01-21   21
2001-01-22   21
2001-01-23   23
2001-01-24   24
2001-01-25   24

会导致这个结果

2001-01-20   21
2001-01-23   23
2001-01-24   24

现在我会这样做

dff = df.diff() # Compute another Series with the differences
dff.ix[0, ] = df.ix[0, ] # Instead of NAN for the row use first row of df
df['diff'] = dff # Add as column in df
df = df[df['diff'] >= 1] # Filter out 
df = df.ix[:, 0:-1] # Drop additional column

这似乎非常复杂。我觉得我错过了什么。有没有想法如何使其更具有Pythonic和Panda风格?


df.drop_duplicates()有什么问题?而且你的代码无法运行,cumsum在哪里定义了? - EdChum
1
好的,在这个例子中,df.drop_duplicates会起作用,但如果我有一个周期性信号。例如正弦波样式。在这种情况下,我会错过变化。 - Joachim
抱歉,您能否用示例代码和期望的输出来解释一下您的意思,我真的不太清楚。 - EdChum
所以你想要过滤掉差异大于1的行? - EdChum
你的问题和这个一样吗:https://dev59.com/d2Ik5IYBdhLWcg3wPL7R? - EdChum
df pd.DataFrame([.0,.0,.1,.1,.0,.2,.0],pd.date_range(start='2001-1-1', freq='D', periods=7))df.drop_duplicates() 的结果将会得到一个有3行的DataFrame,但是有5个变化... - Joachim
1个回答

9

您可以使用.shift()比较前一行和当前行,然后使用相应的布尔序列索引DataFrame:

df.loc[df['a'] != df['a'].shift()]

我假设你的列名为“a”。

.shift() 可以将一列/序列中的值向上或向下移动指定的位置数(默认向下移动1个位置)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接