【发布时间】:2019-09-24 12:28:56
【问题描述】:
我之前问了一个有点欠缺的问题,可以找到here。在我匆忙写下这个问题时,我意识到我实际上提出了错误的问题。出色的答案并没有反映我要解决的问题。唉,这是我再试一次。
我的数据包含在 pandas 数据框中(在一列上)。为了解决这个问题,假设它看起来像这样(我们使用数据框的小视图的 numpy 版本):
array([['a', 125183.195],
['t', 125529.335],
['t', 125626.555],
['a', 125632.485],
['h', 125755.395],
['h', 125868.105],
['e', 125892.82],
['e', 126007.555],
[' ', 126113.25],
[' ', 126221.61],
['w', 126695.285],
['w', 126827.34],
['-', 127149.21],
['-', 127269.435],
['s', 127668.525],
['h', 127789.04],
['s', 127800.76],
['h', 127887.645]])
我们将整个数组称为D。
现在,我有大约 2000 个这样的数组,每个数组平均有大约 300-400 行。所以这里没有对性能的巨大需求。
回到我们的 MWE 列表,我们只对数组排序感兴趣只使用第一列:
array(['a', 't', 't', 'a', 'h', 'h', 'e', 'e', ' ', ' ', 'w', 'w','-', '-', 's', 'h', 's', 'h'])
现在列表中的项目应该的结构是连续对的结构(但出于数据收集的原因,它们不是)。所以这是我们的目标排序列:
array(['a', 'a', 't', 't', 'h', 'h', 'e', 'e', ' ', ' ', 'w', 'w','-', '-', 's', 's', 'h', 'h'])
这是问题所在:这些列包含几乎个连续的项目对(上例中的数字),但其中一些是乱序的,必须移回它们的伙伴(见上文)。为了进一步解决这个问题,D 中的第二列是数字,这些条目是唯一的,它们也需要遵循新的重新排序。所以最终的结果,我们的目标,对于这个最小的例子是:
array([['a', 125183.195],
['a', 125632.485],
['t', 125529.335],
['t', 125626.555],
['h', 125755.395],
['h', 125868.105],
['e', 125892.82],
['e', 126007.555],
[' ', 126113.25],
[' ', 126221.61],
['w', 126695.285],
['w', 126827.34],
['-', 127149.21],
['-', 127269.435],
['s', 127668.525],
['s', 127800.76],
['h', 127789.04],
['h', 127887.645]])
因此重要的是字符对的垂直顺序。它们出现在数组中的位置是我的问题域的关键,因此它们只能移动到相关的对中,但是除了移动每对的成员之外,第一个对成员不能移动。
需要注意的几点:
- 性能并不是真正的问题,因为它们只需要排序一次。
- 无序模式是不一致一致的,并且每列中的事情会发生很多变化,重要的是每个项目都映射回其伙伴。
- 第一列中的项目总是成对出现。
我正在寻求一种方法的帮助,该方法可以将D 的行排序为所需的对顺序。感谢并为我的第一个错误指定的问题道歉。
【问题讨论】:
-
顺序重要吗?我的意思是,先放符号再放字母有关系吗?
-
不,水平顺序无关紧要,但垂直顺序(即行的顺序)才是重要的。所以要么(符号,数字)要么(数字,符号)。