Сортировка уникальных последовательных пар элементов в кадре данных панд со сложными выбросами - PullRequest
1 голос
/ 10 ноября 2019

Ввод

Мои данные содержатся в кадре данных pandas (в столбце). Ради этой проблемы предположим, что это выглядит примерно так (где мы используем небольшую версию небольшого представления кадра данных):

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'. Так что в конечном выводе отсутствует четвертая строка сверху и третья снизу, потому что они не соответствуют условию.
  • Но иногда мы также получаем последовательности символов, которые имеют только «А»но в конечном итоге получить совпадающую букву «B», такую ​​как последовательности 'α','α','α','α','α','α','α' - такие последовательности действительны, потому что даже если они не являются парой, они принадлежат к одной группе из-за индикатора «start» 'A' и концаиндикатор 'B' этого символа. Но если для символа нет подходящего индикатора конца или начала, его нужно удалить из окончательного списка.
  • Сбор данных несколько случайный, поэтому вещи выглядят не по порядку.

Я ищу помощь в методе, который может сортировать строки массивов, подобных этому, в требуемый последовательный порядок пары. Заранее спасибо, пожалуйста, дайте мне знать, если не ясно, что я ищу, и я добавлю больше описания.

...