Моя текущая структура данных была такой, как показано ниже,
0 1 2
0 HA-567034786 AB-1018724 None
1 AB-6348403 HA-7298656 None
После использования apply() я просто делаю это так:
def make_dict(row):
s = set(x for x in row if x)
return {x: list(s - {x}) for x in s}
result = df.apply(make_dict, axis=1).to_frame(name = 'duplicates')
duplicates
1 {'HA-567034786': ['AB-1018724'],'AB-1018724':['HA-567034786']}
2 {'AB-6348403': ['HA-7298656'],'HA-7298656':['AB-6348403']}
Теперь я застрял на том, чтобы сделать его одномерным словарем, как показано ниже,
{
'HA-567034786': ['AB-1018724'],'AB-1018724':['HA-567034786'],
'AB-6348403': ['HA-7298656'],'HA-7298656':['AB-6348403']
}






Вместо этого apply используйте понимание словаря со сглаживанием:
print (df)
0 1
0 HA-567034786 AB-1018724
1 AB-6348403 HA-7298656
def make_dict(row):
s = set(x for x in row if x)
return {x: list(s - {x}) for x in s}
result = {k:v for x in df.values for k, v in make_dict(x).items()}
print (result)
{'HA-567034786': ['AB-1018724'],
'AB-1018724': ['HA-567034786'],
'HA-7298656': ['AB-6348403'],
'AB-6348403': ['HA-7298656']}
Другое решение с apply:
result = {k:v for x in df.apply(make_dict, axis=1) for k, v in x.items()}
Также вы можете использовать коллекции.ChainMap() для группировки всех словарей в один как:
from collections import ChainMap
res =dict(ChainMap(*result['duplicates']))
Ты звездный друг :)