在python列表中对连续的项目对进行排序

时间:2019-09-24 09:56:44

标签: python pandas sorting

我拥有的数据实际上包含在pandas数据框中(在列中),但是出于本文的目的,我们将其提取出来以解决问题。

假设我们有一个数据列df,其中有列col1,我们将其存储为列表:L = df.col1.tolist()。现在,我有大约2000个这些列/列表,平均它们的长度约为300-400。因此,这里不需要大量的性能。

返回到我们的MWE列表,它的结构由以下(ish)组成:

L = [1,2,2,1,3,3,4,4,5,5,6,6,1,2,1,2,7,7,8,8]

现在,列表 中项目的结构应该是连续对的(但出于数据收集的原因,不是这样)。因此,这是我们要针对的排序列表:

L = [1,1,2,2,3,3,4,4,5,5,6,6,1,1,2,2,7,7,8,8]

为了清楚起见,我将它们添加为元组:

L = [(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(1,1),(2,2),(7,7),(8,8)]

问题所在:这些列包含几乎 个按顺序排列的项对(上例中的数字),但其中一些顺序混乱,必须移回其伙伴(请参见上文) )。

需要注意的几件事:

  • 上面的列表包含数字,实际上,我们正在处理字符串
  • 数据通常位于熊猫数据框中的一列上(不确定是否有帮助,但可能会有用)
  • 性能并不是真正的问题,因为它们只需排序一次即可。
  • 乱序模式是不一致,并且每列中的内容变化很大,重要的是每个项目都被映射回其伙伴。

我正在寻找一种方法,可以将这些列表/列按所需的顺序顺序排列。谢谢!

1 个答案:

答案 0 :(得分:1)

好的,因为您可以保证它们总是配对,所以我只需要保持连续计数,您基本上只需要生成一个元素列表即可,就可以在元素对中遇到第一个元素(所以当计数等于零),然后当计数变为2时,重置该项目的计数。然后只需按顺序将这第一批元素列表“分解”为对的列表即可,如此又快又脏:

In [1]: L = [1,2,2,1,3,3,4,4,5,5,6,6,1,2,1,2,7,7,8,8]

In [2]: from collections import Counter

In [3]: counts = Counter()

In [4]: order = []

In [5]: for x in L:
   ...:     n = counts[x]
   ...:     if n == 0:
   ...:         order.append(x)
   ...:         counts[x] += 1
   ...:     elif n == 2:
   ...:         counts[x] = 0
   ...:     else:
   ...:         counts[x] += 1
   ...:

In [6]: order
Out[6]: [1, 2, 3, 4, 5, 6, 1, 2, 7, 8]

In [7]: result = []

In [8]: for x in order:
   ...:     result.append(x)
   ...:     result.append(x)
   ...:

In [9]: result
Out[9]: [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 1, 1, 2, 2, 7, 7, 8, 8]

当然,您应该为此提供一个函数。