【问题标题】:Grouping data by whether or not the data's feature intersects根据数据的特征是否相交对数据进行分组
【发布时间】:2019-03-27 01:07:30
【问题描述】:

假设我们有一张桌子:

id  | aliases
-------------
0   | ['a0', 'a1', 'a4', 'a11']
1   | ['a3', 'a5']
2   | ['a16', 'a18']
3   | ['a6', 'a8', 'a10']
4   | ['a7', 'a8', 'a9']
5   | ['a3', 'a12', 'a14']
6   | ['a5', 'a16', 'a17']

我想将映射到同一个aliases 的所有id 组合在一起;换句话说,最终结果将所有具有相交的aliasesid 组合在一起,递归应用。在上述情况下,我们会:

  • 0 映射到 ['a0', 'a1', 'a4', 'a11']
  • 1256 映射到 ['a3', 'a5', 'a12', 'a14', 'a16', 'a17', 'a18']
  • 34 映射到 ['a6', 'a7', 'a8', 'a9', 'a10']

有没有一种有效的方法来做到这一点?在我的实际用例中,我有大约 1500 万行。

有一种简单的方法可以流式传输行并检查每个新行中aliases 的每个元素是否在到目前为止处理的aliases 中;如果是这样,则将所有具有匹配aliases 的行的id 收集在一起,并将它们映射到匹配的aliases 的并集。

但是,这种方法在计算上似乎不切实际。

【问题讨论】:

  • 这对我来说毫无意义,您将idlist 映射在一起的规则是什么?任何时候它和另一个 id 有共同点并且是递归的?
  • 如果您的列表不长,我不明白为什么这是不切实际的。但很难说没有数据样本。
  • @RockyLi 是的,就是这样,对不起,我会编辑问题以使其更清楚。
  • 我也没有很好地理解这个问题。您想为常见别名创建唯一 ID 吗?我认为 LSH 算法有帮助。

标签: python pandas dataframe data-structures group-by


【解决方案1】:

在此表上运行 O(n*len(groupcount) 复杂性代码应该不会那么难,只是我的想法:

假设您有 id 作为 id 列表和 aliases 作为列表列表,您可以这样做:

bins = []
sets = []
for i in id: # Assume from (0 - n)
    alias = aliases[i]
    in_set = False
    for j in range(len(sets)):
        if len(sets[j].intersection(set(alias))) > 0:
            sets[j].update(set(alias)) # add alias to set, if any difference
            in_set = True
            bins[j].append(i) # append id to bins
            break
    if not in_set:
        bins.append([i])
        sets.append(set(alias))

bins 将包含id 组,sets 中的相应元素将包含alias 组,您可以使用list() 将这些集合转换回list。而且由于所有集合操作都是基于哈希的,这确保您的程序在O(n*groupcount) 时间运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 2020-08-05
    • 2021-07-24
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多