在每列 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]}]
我将 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]}]