Как выполнять append нескольких значений внутри одного цикла?

Как выполнить заполнение значений словаря внутри одного цикла? Пока выполняется append с помощью нескольких циклов по значениям, но интересно, как это сделать в рамках одного цикла

Код выглядит так:

import pandas as pd

dict1 = dict()
a = pd.ExcelFile("D:/Excel_PZ_py/dict_lvl3.xlsx")
df = pd.read_excel(a)
df['A'] = df['A'].fillna(method="ffill")
df['B'] = df['B'].fillna(method="ffill")
A_unique = df['A'].unique()
for A in A_unique:
    A_df = df.loc[df['A'] == A]
    dict1[A] = dict()
    dictA = dict1[A]
    for B in A_df['B']:
        dictA[B] = dict()
        dictB = dictA[B]
        for C in A_df['C']:
            dictB[C] = []
        for i, data in enumerate(A_df['data']):
            dictB[A_df['C'].values[i]].append(data)
        for j, val in enumerate(A_df['val']):
            dictB[A_df['C'].values[j]].append(val)

исходные данные:

введите сюда описание изображения

A   B   C   data    val
a1  b1  c11 1   5
        c22 2   6
a2  b2  c21 3   8
        c22 4   1
a3  b3  c31 5   6
        c32 6   5
        c33 7   4

результат:

{'a1': {'b1': {'c11': [1, 5], 'c22': [2, 6]}},
 'a2': {'b2': {'c21': [3, 8], 'c22': [4, 1]}},
 'a3': {'b3': {'c31': [5, 6], 'c32': [6, 5], 'c33': [7, 4]}}}

Ответы (1 шт):

Автор решения: strawdog

В общем, решение больно костыльое получается. А если получается такое решение, значит, скорее всего, есть проблемы на этапе подготовки данных. То есть, возможно, есть способ изначально подготовить данные так, чтобы потом с ними было легче работать. пока же, могу предложить такое решение:

df = df.fillna(method="ffill")
df["data"] = df[["data", "val"]].values.tolist()

res = res.fromkeys(df["A"].values)

for i, g in df.groupby("B"):
    res[g["A"].iloc[0]] = {i:{}}


for i in res.keys():
    for j in res[i].keys():
        res[i][j] = dict(zip(df.loc[df["B"]==j,"C"], df.loc[df["B"]==j,"data"]))

res:

{'a1': {'b1': {'c11': [1, 5], 'c22': [2, 6]}}, 'a2': {'b2': {'c21': [3, 8], 'c22': [4, 1]}}, 'a3': {'b3': {'c31': [5, 6], 'c32': [6, 5], 'c33': [7, 4]}}}
→ Ссылка