我拥有的数据实际上包含在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)]
问题所在:这些列包含几乎 个按顺序排列的项对(上例中的数字),但其中一些顺序混乱,必须移回其伙伴(请参见上文) )。
需要注意的几件事:
我正在寻找一种方法,可以将这些列表/列按所需的顺序顺序排列。谢谢!
答案 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]
当然,您应该为此提供一个函数。