Pandas在所选列中查找重复的连接值

时间:2018-04-18 16:16:25

标签: python python-3.x pandas dataframe set

我想在df

的选定列中找到重复项
# converts the sub df into matrix
mat = df[['idx', 'a', 'b']].values
str_dict = defaultdict(set)

for x in np.ndindex(mat.shape[0]):
    concat = ''.join(str(x) for x in mat[x][1:])
    # take idx as values of each key a + b
    str_dict[concat].update([mat[x][0]])

dups = {}
for key in str_dict.keys():
    dup = str_dict[key]
    if len(dup) < 2:
        continue

    dups[key] = dup

代码会找到ab串联的重复项。使用连接作为集合defaultdictstr_dict)的密钥,使用idx值更新密钥;最终使用dictdups)来存储任何串联,如果其值(集合)的长度是&gt; = 2.

我想知道在效率方面是否有更好的方法。

2 个答案:

答案 0 :(得分:2)

您可以连接并转换为set:

res = set(df['a'].astype(str) + df['b'].astype(str))

示例:

df = pd.DataFrame({'idx': [1, 2, 3],
                   'a': [4, 4, 5],
                   'b': [5, 5,6]})

res = set(df['a'].astype(str) + df['b'].astype(str))

print(res)

# {'56', '45'}

如果您还需要映射索引:

df = pd.DataFrame({'idx': [1, 2, 3],
                   'a': [41, 4, 5],
                   'b': [3, 13, 6]})

df['conc'] = (df['a'].astype(str) + df['b'].astype(str))
df = df.reset_index()
res = df.groupby('conc')['index'].apply(set).to_dict()

print(res)
# {'413': {0, 1}, '56': {2}}

答案 1 :(得分:1)

您可以在drop_duplicate

之前过滤所需的列
df[['a','b']].drop_duplicates().astype(str).apply(np.sum,1).tolist()
Out[1027]: ['45', '56']