Python 折叠系列中相同的相邻行

Python 折叠系列中相同的相邻行,python,pandas,Python,Pandas,基本上,如果my pandas dataframe的一列如下所示: [1 1 1 2 2 2 3 3 3 1 1] 我想把它变成以下内容: [1 2 3 1] x = pandas.Series([1 1 1 2 2 2 3 3 3 1 1]) y = x-x.shift(1) y[0] = 1 result = x[y!=0] 您可以编写一个简单的函数,在系列元素之间循环,只存储运行中的第一个元素。 据我所知,熊猫没有内置的工具来实现这一点。但是,它不是很多代码来做自己 import p

基本上,如果my pandas dataframe的一列如下所示:

[1 1 1 2 2 2 3 3 3 1 1]
我想把它变成以下内容:

[1 2 3 1]
x = pandas.Series([1 1 1 2 2 2 3 3 3 1 1])
y = x-x.shift(1)
y[0] = 1
result = x[y!=0]
您可以编写一个简单的函数,在系列元素之间循环,只存储运行中的第一个元素。 据我所知,熊猫没有内置的工具来实现这一点。但是,它不是很多代码来做自己

import pandas
example_series = pandas.Series([1, 1, 1, 2, 2, 3])

def collapse(series):
    last = ""
    seen = []
    for element in series:
        if element != last:
            last = element
            seen.append(element)
    return seen
        
collapse(example_series)
在上面的代码中,您将迭代一个系列的每个元素,并检查它是否与看到的最后一个元素相同。如果不是,请保存它。如果是,则忽略该值

如果需要将返回值作为一个系列处理,可以将函数的最后一行更改为:

return pandas.Series(seen)

您可以编写执行以下操作的函数:

[1 2 3 1]
x = pandas.Series([1 1 1 2 2 2 3 3 3 1 1])
y = x-x.shift(1)
y[0] = 1
result = x[y!=0]

您可以使用DataFrame的差异和索引:

>>> df = pd.DataFrame([1,1,2,2,2,2,3,3,3,3,1])
>>> df[df[0].diff()!=0]
    0
0   1
2   2
6   3
10  1
>>> df[df[0].diff()!=0].values.ravel() # If you need an array
array([1, 2, 3, 1])
系列的作品相同:

>>> df = pd.Series([1,1,2,2,2,2,3,3,3,3,1])
>>> df[df.diff()!=0].values
array([1, 2, 3, 1])

您可以使用
shift
创建布尔掩码,将该行与前一行进行比较:

In [67]:
s = pd.Series([1,1,2,2,2,2,3,3,3,3,4,4,5])
s[s!=s.shift()]

Out[67]:
0     1
2     2
6     3
10    4
12    5
dtype: int64

顺序重要吗?您是在使用数据帧还是系列?我不想要唯一的元素。参见上面的修订示例。并假设数据帧只有一列。