我有两个数据框。列为:“ x”,“ y”,“名称”。
两个数据集的它们是相同的。 x和y是它们自己的列表。这就是一个数据框的样子
x ----- y------- name
0 [0.4752243077637221, 0.6520124241756947, 0.468... [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... D 1#0 ξ:3τ:0.1
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... [0.38764437658969714, 0.5140357108089131, 0.75... D 1#1 ξ:3τ:0.1
2 [0.20785203454036535, 0.1204140394378531, 0.22... [0.8566063230698455, 0.8234990482161559, 0.826... D 2#0 ξ:3τ:0.1
3 [0.4752243077637221, 0.6520124241756947, 0.585... [0.38764437658969714, 0.5140357108089131, 0.62... D 2#1 ξ:3τ:0.1
4 [0.7019329992171317, 0.9106333194078352, 0.786... [0.7054927087841893, 0.8111061879179277, 0.845... D 2#2 ξ:3τ:0.1
第二个数据框可能具有更多或更少的行,并且名称将有所不同。我想检查两个数据框中的x-y坐标,与行无关-并删除是否重复。
目标是描述聚类算法的对称差异
我已经尝试过:
difference = pd.concat([all_clusters_a, all_clusters_b]).drop_duplicates(keep=False, inplace=False)
enter code here
这会导致:TypeError:无法散列的类型:'numpy.ndarray'
,并出现以下相同错误:
all_clusters_a.iloc[1:4]= all_clusters_b[:3].values
all_clusters_a['a']='a'
all_clusters_a.set_index('a', append=True, inplace=True)
all_clusters_b['b']='b'
all_clusters_b.set_index('b', append=True, inplace=True)
mergeda = all_clusters_a.append(all_clusters_b)
mergeda = mergeda.drop_duplicates().sort_index()
idx = pd.IndexSlice
complement_BiA = mergeda.loc[idx[:,'a'],:]
mergedb = all_clusters_b.append(all_clusters_b)
mergedb = mergedb.drop_duplicates().sort_index()
complement_AiB = mergedb.loc[idx[:,'b'],:]
numpy.ndarray似乎讨厌drop_duplicate()
答案 0 :(得分:0)
一种解决方案是拆分ndarray,将其放入列中,然后检查重复项:
dfx = pd.DataFrame(all_clusters_a['x'].values.tolist())
dfy = pd.DataFrame(all_clusters_a['y'].values.tolist())
df = pd.concat([dfx,dfy], axis=1)
您需要对all_clusters_b进行相同的操作,然后将两个重复的行进行比较。
如果您从ndarrays中创建元组,则可能会更快:
dfx = all_clusters_a['x'].apply(tuple)
dfy = all_clusters_a['y'].apply(tuple)
df = pd.concat([dfx,dfy], axis=1)
答案 1 :(得分:0)
不幸的是,您的第一个建议抛出了错误的期望列表,得到了numpy.ndarray
第二个建议似乎可行。最终结果目前看起来像这样:
dfxa = all_clusters_a['x'].apply(tuple)
dfya = all_clusters_a['y'].apply(tuple)
dfa = pd.concat([dfxa,dfya], axis=1)
dfxb = all_clusters_b['x'].apply(tuple)
dfyb = all_clusters_b['y'].apply(tuple)
dfb = pd.concat([dfxb,dfyb], axis=1)
difference = pd.concat([dfa, dfb]).drop_duplicates(keep=False, inplace=False)