在python列表中对相同元素的索引进行分组的有效方法

时间:2019-06-18 03:34:01

标签: python pandas group-by

假设我有一个看起来像这样的列表:

[1, 2, 2, 5, 8, 3, 3, 9, 0, 1]

现在,我想对相同元素的索引进行分组,因此结果应类似于:

[[0, 9], [1, 2], [3], [4], [5, 6], [7], [8]]

如何有效地做到这一点?我尽量避免使用循环,因此任何使用numpy / pandas函数的实现都很棒。

4 个答案:

答案 0 :(得分:3)

您可以使用collections.defaultdict对索引进行分组:

from collections import defaultdict

lst = [1, 2, 2, 5, 8, 3, 3, 9, 0, 1]

d = defaultdict(list)
for i, x in enumerate(lst):
    d[x].append(i)

print(list(d.values()))
# [[0, 9], [1, 2], [3], [4], [5, 6], [7], [8]]

这也保持添加索引的顺序而不进行排序。

答案 1 :(得分:3)

使用熊猫GroupBy.apply,这非常简单-使用数据对一系列索引进行分组。一个不错的好处是,您可以保持索引的顺序。

data = [1, 2, 2, 5, 8, 3, 3, 9, 0, 1]
pd.Series(range(len(data))).groupby(data, sort=False).apply(list).tolist()
# [[0, 9], [1, 2], [3], [4], [5, 6], [7], [8]]

答案 2 :(得分:0)

此解决方案是对哈希计数的一种修改,但不存储计数,只需存储找到的值的索引即可。

df2 = df1.filter("Status = 2 OR Status = 3")

答案 3 :(得分:0)

不确定为什么要“避免循环”,因为无法知道正在调用的函数还是不使用循环,这增加了函数调用的开销。

此外,在分组之后,您会丢失有关分组内容的信息-因此将输出放在dict中似乎更有意义。

这样做:

from itertools import groupby

l = [1, 2, 2, 5, 8, 3, 3, 9, 0, 1]
result = {
    key: [item[0] for item in group]
    for key, group in groupby(sorted(enumerate(l), key=lambda x: x[1]), lambda x: x[1])
}

print(result)

输出:

{0: [8], 1: [0, 9], 2: [1, 2], 3: [5, 6], 5: [3], 8: [4], 9: [7]}