在每列 Pandas 数据框中查找重复索引

Find indexes of duplicates in each column Pandas dataframe

我将 Pandas 数据框的每一列中的重复值分组如下:

import pandas as pd

ls = [[0,'A',2],
      [2,'B',1],
      [1,'A',3],
      [1,'C',2],
      [1,'D',3]]

df = pd.DataFrame(ls)
print(df)

results = []
for i in range(len(ls[0])):
    duplicates = {}
    for e in range(len(df[i])):
        key = df[i][e]
        if key in duplicates:
            duplicates[key].append(e)
        else:
            tmp = [e]
            duplicates[key] = tmp
    results.append(duplicates)

print(results)
#Output:
# [
# {0: [0], 2: [1], 1: [2, 3, 4]}, 
# {'A': [0, 2], 'B': [1], 'C': [3], 'D': [4]}, 
# {2: [0, 3], 1: [1], 3: [2, 4]}
# ]

问题是我的数据框中的行数可能很大,即 1M-2M,并且该方法效率低下。 您能否建议一种有效的方法来提高该解决方案的性能? Panda 或 Numpy 是否有方法可以让您有效地获得类似的结果?

如果只有几列,您可以使用列表推导式对索引的聚合值进行 Index.to_series 转换为 Series

idx = df.index.to_series()
d = [idx.groupby(df[c], sort=False).agg(list).to_dict() for c in df.columns]
print (d)
[{0: [0], 2: [1], 1: [2, 3, 4]}, 
 {'A': [0, 2], 'B': [1], 'C': [3], 'D': [4]},
 {2: [0, 3], 1: [1], 3: [2, 4]}]

或者如果许多列按 DataFrame.melt 重塑,聚合 lsit 并最后展平 MultiIndex Series:

s = (df.melt(ignore_index=False)
       .reset_index()
       .groupby(['variable','value'], sort=False)['index']
       .agg(list))

d = {level: s.xs(level).to_dict() for level in s.index.levels[0]}

最简单的是解决方案启发了另一个答案:

d = [df.groupby(c, sort=False).groups for c in df.columns] 

你可以在pandas中使用groupby,这非常简单

result = []
for column in range(len(df.columns)):
    gp = df.groupby(column)
    result.append(gp.groups)
print(result)

对应的输出为

[{0: [0], 1: [2, 3, 4], 2: [1]}, {'A': [0, 2], 'B': [1], 'C': [3], 'D': [4]}, {1: [1], 2: [0, 3], 3: [2, 4]}]