Симметричная разность двух панелей данных - PullRequest
0 голосов
/ 11 марта 2019

У меня есть два кадра данных.Столбцы: «х», «у», «имя».

Они одинаковы для обоих наборов данных.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: unhashable type: '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 голосов
/ 12 марта 2019

к сожалению, ваши первые предложения выдают ошибку Expected list, получили 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)
0 голосов
/ 11 марта 2019

Одним из решений является разделение ndarrays, размещение их в столбцах и проверка на наличие дубликатов:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...