繁体   English   中英

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

[英]Symmetric difference of two pandas dataframes

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

第二个数据框可能具有更多或更少的行,并且名称会有所不同。 我想检查两个数据框中的哪些xy坐标,与行无关-并删除是否重复。

目的是描述聚类算法的对称差异

我已经尝试过:

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()

一种解决方案是拆分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)

不幸的是,您的第一个建议抛出了错误的期望列表,得到了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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM