У меня есть словарь следующим образом:
D = {
'd1': [[a1, a1, a1], [a2, a2, a2], [a3, a3, a3]],
'd2': [[b1, b1, b1], [b2, b2, b2], [b3, b3, b3]],
'd3': [[c1, c1, c1], [c2, c2, c2], [c3, c3, c3]],
'd4': [[d1, d1, d1], [d2, d2, d2], [d3, d3, d3]]
}
Как преобразовать его в dataframe так, чтобы
Столбцы из списков для ключа находятся в паре; вложенные списки - это значения времени, температуры и значения повреждений, соответственно, и данные должны иметь их в отдельных столбцах. S для [[a1, a1, a1], [a2, a2, a2], [a3, a3, a3]]
вы получите строку с a1, a2, a3
(первый столбец), за которой следует строка для вторая колонка и т.д.
Строки dataframe сгруппированы путем объединения ключей со следующей клавишей, d1
сочетании с d2
составляют 6 строк (3 из d1
и 3 из d2
), затем d2
объединяется с d3
чтобы сделать еще 6 строк и т.д. Итак, для 4 ключей с 3 ряда, вы получаете 3 комбинации из 6 строк == 18 строк.
Я попытался преобразовать в dataframe перед конкатенацией:
new_df = pd.DataFrame(list(D.values()), columns=['Time_sec', 'Temperature', 'Damage'])
но я все еще придерживаюсь конкатенирующей части.
Пример ожидаемого результата:
Вы хотите, чтобы zip()
вместе каждый подсписок для заданного ключа, чтобы сформировать новые строки со значениями из каждого подсети в сочетании:
>>> list(zip(*D['d1']))
[('a1', 'a2', 'a3'), ('a1', 'a2', 'a3'), ('a1', 'a2', 'a3')]
затем примените это к каждому значению в словаре, чтобы создать сглаженную последовательность строк, где вы выбираете свои пары.
Я предполагаю, что вы хотите dN
с dN+1
здесь, независимо от количества ключей. Обратите внимание, что словари на самом деле неупорядочены (хотя Python 3.6 и порядок добавления сохраняются), поэтому вы можете сначала применить некоторую сортировку:
sorted_keys = sorted(D)
после чего мы можем zip(sorted_keys, sorted_keys[1:])
их с zip(sorted_keys, sorted_keys[1:])
:
>>> sorted_keys = sorted(D)
>>> list(zip(sorted_keys, sorted_keys[1:]))
[('d1', 'd2'), ('d2', 'd3'), ('d3', 'd4')]
Используйте эту последовательность, чтобы соединить строки и сгладить результирующую последовательность клавиш, затем застегнутые строки:
sorted_keys = sorted(D)
paired = (k for keys in zip(sorted_keys, sorted_keys[1:]) for k in keys)
df = pd.DataFrame(
(row for k in paired for row in zip(*D[k])),
columns=['Time_sec', 'Temperature', 'Damage']
)
Это дает:
Time_sec Temperature Damage
0 a1 a2 a3
1 a1 a2 a3
2 a1 a2 a3
3 b1 b2 b3
4 b1 b2 b3
5 b1 b2 b3
6 b1 b2 b3
7 b1 b2 b3
8 b1 b2 b3
9 c1 c2 c3
10 c1 c2 c3
11 c1 c2 c3
12 c1 c2 c3
13 c1 c2 c3
14 c1 c2 c3
15 d1 d2 d3
16 d1 d2 d3
17 d1 d2 d3
Использование перечисления
l = ['Time', 'Temperature', 'Damage']
d2 = {}
for idx, item in enumerate(l):
for k, v in d.items():
if item not in d2:
d2[item] = v[idx]
else:
d2[item] += v[idx]
{'Time': ['a1, a1, a1', 'b1, b1, b1', 'c1, c1, c1', 'd1, d1, d1'], 'Temperature': ['a2, a2, a2', 'b2, b2, b2', 'c2, c2, c2', 'd2, d2, d2'], 'Damage': ['a3, a3, a3', 'b3, b3, b3', 'c3, c3, c3', 'd3, d3, d3']}
Использование псевдозначений
a1, a2, a3 = 0, 'a', '!'
b1, b2, b3 = 0, 'a', '!'
c1, c2, c3 = 0, 'a', '!'
d1, d2, d3 = 0, 'a', '!'
{'Time': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Temperature': ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'], 'Damage': ['!', '!', '!', '!', '!', '!', '!', '!', '!', '!', '!', '!']}
a1
,a2
и т. Д. Ссылками на самом деле числа с плавающей запятой?