Итак, если вы не слишком увлечены мультииндексом, вот один из способов получить ваши данные, как вы ожидаете:
import pandas as pd
test= pd.DataFrame({'row':['a','b','c','d'],'col_A' : ["Alexis","Alexi","Peter","Pete"]})
names = pd.DataFrame({'A' : ["Alexis","Alexi","Peter","Pete"],
'B' : ["Alexi","Alexis","Pete","Peter"],
"similarity" : [0.9,0.9,0.8,0.8]})
Обратите внимание, я не set_index
test
, но вы можете сделать это, это немного изменит следующее (см. Комментарии). Вы можете создать a
фрейм данных, такой как:
import itertools
a = pd.DataFrame([p for p in itertools.combinations(test['col_A'], 2)],columns =['A','B'],
index=['%s,%s'%p for p in itertools.combinations(test['row'], r=2)])
# here if you did set_index your test, then replace
# index=['%s,%s'%p for p in itertools.combinations(test['row'], r=2)] by
# index=['%s,%s'%p for p in itertools.combinations(test.index, r=2)]
И это выглядит так:
A B
a,b Alexis Alexi
a,c Alexis Peter
a,d Alexis Pete
b,c Alexi Peter
b,d Alexi Pete
c,d Peter Pete
Затем вы можете использовать reset_index
(чтобы получить текущий индекс в виде столбца, но это зависит от того, что именно вы хотите) merge
с names
для столбцов A и B, заполнить nan
0, отбросить два столбцы A и B и переименовать (при необходимости):
a = a.reset_index().merge(names, how = 'left', on = ['A','B']).fillna(0).\
drop(labels = ['A','B'], axis=1).rename(columns = {'index':'row', 'similarity':'col_A'})
Дайте мне знать, сможете ли вы делать то, что вы хотите после
РЕДАКТИРОВАТЬ: с новым выходом, который вы ищете, вы можете сделать:
a = pd.DataFrame([p for p in itertools.combinations(test['col_A'], 2)],columns =['A','B'],
index=pd.MultiIndex.from_tuples([p for p in itertools.combinations(test.index, r=2)], names=['first', 'second']))
Примечание: itertools
генерирует кортежи, которые используются в pd.MultiIndex.from_tuples
для определения вашего мультииндексного DF.
Теперь вы можете merge
(чтобы сохранить мультииндекс, вам нужно reset_index
до и set_index
после:
a = a.reset_index().merge(names, how = 'left', on = ['A','B']).fillna(0).\
drop(labels = ['A','B'], axis=1).set_index(['first', 'second'])