【问题标题】:NumPy/Pandas: remove sequential duplicate values (equivalent of bash uniq without sort) [duplicate]NumPy/Pandas:删除顺序重复值(相当于没有排序的 bash uniq)[重复]
【发布时间】:2018-12-04 08:22:48
【问题描述】:

给定一个像这样的 Pandas 系列(或 numpy 数组):

import pandas as pd
myseries = pd.Series([1, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 2, 2, 3, 3, 1])

有没有像 unix uniq 工具那样删除连续重复的好方法? numpy/pandas unique() 和 pandas drop_duplicates 函数删除所有重复项(如 unix 的 | sort | uniq),但我不希望这样:

>>> print(myseries.unique())
[1 2 3 4]

我想要这个:

>>> print(myseries.my_mystery_function())
[1, 2, 3, 4, 3, 2, 3, 1]

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    比较ne (!=) 与shifted Series 并过滤boolean indexing

    myseries = myseries[myseries.ne(myseries.shift())].tolist()
    print (myseries)
    [1, 2, 3, 4, 3, 2, 3, 1]
    

    如果性能很重要,请使用Divakar 解决方案。

    【讨论】:

    • 如果np.nan 存在也可能有问题。
    【解决方案2】:

    我们可以使用slicing -

    In [62]: a = myseries.values
    
    In [63]: a[np.r_[True,a[:-1]!= a[1:]]]
    Out[63]: array([1, 2, 3, 4, 3, 2, 3, 1])
    

    【讨论】:

    • 如果存在np.nan 可能会有问题。
    【解决方案3】:

    使用!=的jezrael版本:

    print(myseries[myseries!=myseries.shift()].tolist())
    

    输出:

    [1, 2, 3, 4, 3, 2, 3, 1]
    

    【讨论】:

    • 运营商不是复制 99% 另一个答案的充分借口。
    • @coldspeed 哦好吧,让我删除这个,好吧...
    • 这取决于你!我真诚地发表了评论。
    • @coldspeed 非常感谢,我想我应该继续...
    猜你喜欢
    • 2016-12-28
    • 2017-10-09
    • 2012-10-07
    • 2018-10-13
    • 2016-11-19
    • 2016-03-05
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多