Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在选定列中查找重复的连接值_Python_Python 3.x_Pandas_Dataframe_Set - Fatal编程技术网

Python 在选定列中查找重复的连接值

Python 在选定列中查找重复的连接值,python,python-3.x,pandas,dataframe,set,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_d

我想在
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
#将子df转换为矩阵
mat=df[['idx','a','b']]。数值
str_dict=defaultdict(设置)
对于np.ndindex中的x(材料形状[0]):
concat=''.join(str(x)表示mat[x][1:]中的x)
#将idx作为每个键a+b的值
str_dict[concat].更新([mat[x][0]]
dups={}
对于str_dict.keys()中的键:
dup=str_dict[键]
如果len(dup)<2:
持续
dups[键]=dup
代码查找
a
b
的串联的重复项。将串联用作集合
defaultdict
str_dict
)的键,用
idx
值更新键;最后使用
dict
dups
)存储任何串联,如果其值(set)的长度>=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}}

您可以在
删除\u duplicate

df[['a','b']].drop_duplicates().astype(str).apply(np.sum,1).tolist()
Out[1027]: ['45', '56']

嗯,假设你有一列
a=[41,4,5],b=[3,13,5]
,这行不通,对吧?正如您将获得两次
'413'
一样?@jpp刚刚忘记了为apply:-)添加axis=1,通过我的示例数据,我得到
['413','413','56']
;我想我们需要在最后转换为set。@jpp我应该得到同样的方法来获得与每个
a
+
b
连接相关的
idx
值,如我的op@daiyue,您如何处理重复项?如果值重复,是否需要行索引列表?返回值应该是一个
dict
,它将每个重复的连接作为键,将
idx
列值作为键的值。@daiyue,我的问题是:如果一个键有多个列值怎么办?哦,在我的代码中,
str_dict
是一个
defaultdict(set)
,所以每个键的值都是一个集合