在Pandas Series中合并相邻的重复行

4
基本上,如果我的pandas数据框的一列看起来像这样:
[1 1 1 2 2 2 3 3 3 1 1]

I'd like it to be turned into the following:

[1 2 3 1]

顺序重要吗?你是在处理DataFrame还是Series? - dmlicht
4个回答

1

你可以编写一个简单的函数,循环遍历你的序列元素,仅存储一次运行中的第一个元素。

据我所知,pandas 中没有内置工具可以做到这一点。但自己编写代码并不需要太多的代码。

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)

我不需要唯一的元素。请参见上面修改后的示例。并且假设有一个只有一列的数据框。 - shane

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]

1
您可以使用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])

同样适用于Series:
>>> df = pd.Series([1,1,2,2,2,2,3,3,3,3,1])
>>> df[df.diff()!=0].values
array([1, 2, 3, 1])

0

您可以使用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

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