两个熊猫数据帧的对称差异

时间:2019-03-11 09:25:14

标签: python pandas dataframe

我有两个数据框。列为:“ 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()

2 个答案:

答案 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)