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)
,所以每个键的值都是一个集合