对具有复杂异常值的熊猫数据框中的唯一连续连续项进行排序

时间:2019-11-10 16:41:24

标签: python arrays pandas sorting columnsorting

输入

我的数据包含在pandas数据框中(在列中)。为了解决这个问题,假设它看起来像这样(在这里我们使用数据帧小视图的numpy版本):

array([['i', 101505.92499994699, 'A'],
       ['m', 101624.589999905, 'A'],
       ['i', 101686.209999956, 'B'],
       ['o', 101696.209999956, 'A'],
       ['p', 101738.094999921, 'A'],
       ['m', 101803.725000005, 'B'],
       ['o', 101847.539999988, 'A'],
       ['p', 101943.93000006699, 'B'],
       ['o', 102031.829999993, 'B'],
       ['r', 102064.49000001901, 'A'],
       ['r', 102175.569999963, 'B'],
       ['a', 102215.54500004301, 'A'],
       ['n', 102352.590000024, 'A'],
       ['a', 102379.3899999, 'B'],
       ['t', 102459.574999986, 'A'],
       ['n', 102469.35499995, 'B'],
       [' ', 102580.80999995599, 'A'],
       ['t', 102588.555000024, 'B'],
       ['e', 102672.149999999, 'A'],
       ['e', 102753.13999992801, 'B'],
       [' ', 102774.405000033, 'B'],
       ['x', 102836.609999882, 'A'],
       ['x', 102962.774999905, 'B'],
       ['a', 102990.560000064, 'A'],
       ['a', 103132.16499984301, 'B'],
       ['α', 103372.664999915, 'A'],
       ['α', 103879.135000054, 'A'],
       ['α', 103911.880000029, 'A'],
       ['α', 103944.404999958, 'A'],
       ['α', 103977.625000058, 'A'],
       ['α', 104008.33999994199, 'A'],
       ['α', 104018.140000058, 'B'],
       ['α', 104279.709999915, 'A'],
       ['α', 104418.629999971, 'B'],
       ['t', 104550.4699999, 'A'],
       ['t', 104640.194999985, 'B'],
       ['a', 104689.35999996, 'A'],
       ['n', 104830.58999991, 'A'],
       ['z', 104930.58999991, 'A'],
       ['a', 104846.105000004, 'B'],
       ['n', 104946.105000004, 'B']], dtype=object)

现在,我有大约2000个这些数组,每个平均有300-400行。因此,这里不需要大量的性能。

回到我们的MWE列表,我们只对使用第一列的数组的顺序感兴趣:

array(['i', 'm', 'i', 'o', 'p', 'm', 'o', 'p', 'o', 'r', 'r', 'a', 'n', 'a',
       't', 'n', ' ', 't', 'e', 'e', ' ', 'x', 'x', 'a', 'a', 'α', 'α',
       'α', 'α', 'α', 'α', 'α', 'α', 'α', 't', 't', 'a', 'n', 'a', 'n'],
      dtype=object)

但是还有一个警告:中间列(数字列)是一个时间戳,因此必须单调增加以使最终结果有意义。

所需的输出

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

array(['i', 'i', 'm', 'm', 'p', 'p', 'o', 'o', 'r', 'r', 'a', 'a', 'n',
       'n', 't', 't', ' ', ' ', 'e', 'e', 'x', 'x', 'a', 'a', 'α', 'α',
       'α', 'α', 'α', 'α', 'α', 'α', 'α', 't', 't', 'a', 'a', 'n', 'n'],
      dtype=object)

最后一列显示为

array(['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A',
       'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'A',
       'A', 'A', 'A', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
      dtype=object)

其他警告

  • 眼神敏锐的读者现在会注意到我遗漏了两行 在原始数组中。这也是由于数据收集错误。为了使一对是“有效的”,因此在 最后一个排序后的数组,它需要在其中有一个'A''B'值 最后一列。因此,最终输出中缺少的是从顶部开始的第四行和从底部开始的第三行,因为它们不满足条件。
  • 但是有时我们还会得到仅具有'A'但最终会得到匹配的'B'的符号序列,例如'α','α','α','α','α','α','α'的序列-这样的序列是有效的,因为即使它们不是一对由于此符号的“开始”指示符'A'和结束指示符'B',它们属于同一组。但是,如果没有符号的匹配结束或开始指示符,则必须将其从最终列表中删除。
  • 数据收集在某种程度上是随机的,因此事情看起来很混乱。

我正在寻找一种方法的帮助,该方法可以将像这样的数组行按所需的对顺序顺序进行排序。在此先感谢您,如果不清楚我要寻找的内容,请告诉我,我将添加更多说明。

0 个答案:

没有答案