【问题标题】:Grouping equivalance row as 2D array in python for very large data set对于非常大的数据集,在python中将等价行分组为二维数组
【发布时间】:2019-01-30 03:35:44
【问题描述】:

我有 100k 行,我想按照下面在 python 中的说明对它进行分组。一个简单的 python 迭代需要很多时间。如何使用任何 python ML 库对其进行优化?

    [[1,2,3,4],[2,3],[1,2,3],[2,3],[1,2,3],[1,2,3,4],[1],[2]...]

    Output
    [[0,5],[1,3]],[2,4],[6],[7]]

    Explanation:  index 0,5 have same list ;
                  index 1,3 have same list ;
                  index 2,4 have same list ; 
                  index 6 no match

我有 100k 个子列表,我想按照上面在 python 中的说明对它进行分组。

【问题讨论】:

  • 订购重要吗? [1,2,3] 会被认为与 [2,1,3] 相同吗?
  • 是的..这很重要..因为列表是 mycase 中数据库的副本
  • 通常每个列表中有多少个元素?所有元素的最大值可能是多少?
  • 填充您的列表以创建一个二维数组,然后使用 numpy.unique(my_array,axis=1) 查找唯一的,最后找到索引。
  • @Divakar..每个列表有 20 个元素..

标签: python pandas numpy machine-learning data-science


【解决方案1】:

一个简单的解决方案是将列表转换为元组,然后只需 groupby 并访问 .groups 属性,如果您想知道每个组的索引

import pandas as pd
df = pd.DataFrame({'vals': [[1,2,3,4], [2,3], [1,2,3], [2,3],
                            [1,2,3], [1,2,3,4], [1], [2], [2,2], [2,1,3]]})

df.groupby(df.vals.apply(tuple)).groups
#{(1,): Int64Index([6], dtype='int64'),
# (1, 2, 3): Int64Index([2, 4], dtype='int64'),
# (1, 2, 3, 4): Int64Index([0, 5], dtype='int64'),
# (2,): Int64Index([7], dtype='int64'),
# (2, 1, 3): Int64Index([9], dtype='int64'),
# (2, 2): Int64Index([8], dtype='int64'),
# (2, 3): Int64Index([1, 3], dtype='int64')}

如果您需要该分组索引列表,请尝试以下操作:

df.reset_index().groupby(df.vals.apply(tuple))['index'].apply(list).sort_values().tolist()
#[[0, 5], [1, 3], [2, 4], [6], [7], [8], [9]]

【讨论】:

    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 2013-03-26
    • 2017-05-06
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多