У меня есть кадр данных pandas, который можно представить так:

test_dict = {('a', 1) : {'shared':0,'x':1, 'y':2, 'z':3}, 
            ('a', 2) : {'shared':1,'x':2, 'y':4, 'z':6},
            ('b', 1) : {'shared':0,'x':10, 'y':20, 'z':30},
            ('b', 2) : {'shared':1,'x':100, 'y':200, 'z':300}}
example = pd.DataFrame.from_dict(test_dict).T

enter image description here

Я пытаюсь найти способ превратить это в фрейм данных, который выглядит как это представление словаря:

res_dict = {1 : {'shared':0,'a':{'x':1, 'y':2, 'z':3}, 'b':{'x':10, 'y':20, 'z':30}},
            2 : {'shared':1,'a':{'x':2, 'y':4, 'z':6},'b':{'x':100, 'y':200, 'z':300}}}
        

Любые предложения приветствуются! Спасибо

1
keynesiancross 18 Ноя 2022 в 22:05

1 ответ

Возможное решение, которое использует только манипуляции с фреймами данных, а затем преобразуется в словарь:

xyz = ['x', 'y', 'z']
out = (example.assign(xyz=example[xyz].apply(list, axis=1)).reset_index()
       .pivot(index='level_0', columns=['level_1', 'shared'], values='xyz')
       .applymap(lambda x: dict(zip(xyz, x))))

out.columns = out.columns.rename(None, level=0)
out.index = out.index.rename(None)

out.append(out.columns.to_frame().iloc[:, 1]).droplevel(
    1, axis=1).iloc[np.arange(-1, len(out))].to_dict()

Выход:

{
    1: {
        'shared': 0,
        'a': {'x': 1, 'y': 2, 'z': 3},
        'b': {'x': 10, 'y': 20, 'z': 30}
    },
    2: {
        'shared': 1,
        'a': {'x': 2, 'y': 4, 'z': 6},
        'b': {'x': 100, 'y': 200, 'z': 300}
    }
}
0
PaulS 18 Ноя 2022 в 23:59
Благодарность! Извините, я должен был быть более ясным, я надеялся получить DataFrame!
 – 
keynesiancross
19 Ноя 2022 в 00:17