Как выполнять 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]}}}
