【问题标题】:Sorting all rows and columns by most similar strings across dataframe通过数据框中最相似的字符串对所有行和列进行排序
【发布时间】:2020-11-14 00:59:08
【问题描述】:

我有一个包含许多列和行的数据框,完全未排序。我想对每一列中的行进行排序,以使每一行中的每个元素都与所有其他列中最相似的元素相邻。我知道this 解决方案,但我希望在多个列表/列之间进行比较,例如排序算法。

     col1     col2      col3      col4
0    Some     Black     Red       Sky
1    Blue     Green     Floor     Bucket
2    Blacky   Same      Green     Rad

让我们考虑第一个字母(前 2?3?)必须是精确命中。这会导致

     col1     col2      col3      col4
0    Some     Same                Sky       #Some and Same are very similar, Sky is the closest in col4                                 
1    Blue                                   #No match for Blue 
2    Blacky   Black               Bucket    #Black,Blacky are similar, and more similar to Bucket
3             Green     Green               #Exact match
4                       Red       Rad       #Similar Match
5                       Floor               #No word started with F in any other column

为了解决这个问题,我想到了:

  1. 对于每一列,构建所有其他列中所有元素的唯一列表,并将目标列与共识对齐。但我不确定之后会怎样
  2. 对于每个元素,为其他每一列找到最接近的 1 个元素。
  3. 按字母顺序排序。

以上都有问题,在所有情况下我都需要做一些人工检查(这很好)。

【问题讨论】:

  • > 从两个表开始,它们的行数与第 1 列中的行数和列数相同。 > 对于每一行: 1. 查找列数 - 从剩余的每一列中找到 1 个匹配项。将基于某些数值度量(例如编辑距离)的最佳匹配添加到第一个数据帧中的相应列,并将度量值添加到另一个;如果第一个字母不匹配,则在第一个数据帧中填充 nan,在第二个数据帧中填充 0。; 2.(假设没有重复)如果一个词已经在列中看到,保留具有较高值的​​一个,删除另一个。 (续)
  • > 一旦你在第一行没有单词,为下一个可用单词创建一个新行,填充缺失的列。 > 重复直到用尽所有单词。这是一个应该在理论上可行的想法。虽然不是最有效的。
  • 非常感谢,好主意!我试试看
  • 我说的是保留“higher value”,但是要保留larger value还是lower value这个词取决于测量功能的选择。
  • @119631 您对如何连接来自其他列的搜索有什么想法?从 col1 开始,我在剩余的每一列中都找到了最佳匹配,但是如何根据 col2 插入最佳匹配呢?和 col3?...

标签: python pandas string algorithm sorting


【解决方案1】:
  1. 为每个单词分配一个 id。
  2. 预先计算每个单词与其他列中的每个单词之间的 Levenshtein 距离。将结果存储在方阵中,按单词的 id 进行索引。
  3. 将行的成本定义为行中所有单词对之间的距离之和。
  4. 现在您需要为每个单词分配一行,以最小化所有行的成本总和,同时遵守同一列中的单词必须位于不同行的约束。这个优化问题是一个二次赋值问题,可以很容易地传递给二次整数规划库。

在第 1 步中,在赋予 ids 时,ids 必须是唯一的,因此认为所有的词都是不同的。两个词是否相同并不重要;无论如何给他们不同的ID。

在第 2 步中,您需要在对应于同一列中的成对单词的单元格中放置一些默认值;您选择的值无关紧要。

在第 4 步中,约束可以改写为“每一行在每一列中只出现一次”,这是一个简单的线性约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2017-05-21
    • 2020-03-27
    • 1970-01-01
    • 2018-04-18
    • 2018-02-28
    • 2014-10-13
    相关资源
    最近更新 更多