Python Словарь ключей с вложенным списком в панды DataFrame

1

У меня есть словарь следующим образом:

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'])

но я все еще придерживаюсь конкатенирующей части.

Изображение 174551

Пример ожидаемого результата:

Изображение 174551

  • 1
    Так являются ли эти a1 , a2 и т. Д. Ссылками на самом деле числа с плавающей запятой?
  • 1
    Не могли бы вы отредактировать пост, чтобы добавить пример того, что вы ожидаете?
Показать ещё 6 комментариев
Теги:
pandas
python-3.x
dictionary
concatenation

2 ответа

2
Лучший ответ

Вы хотите, чтобы 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
  • 0
    молодец, отлично смотрится
  • 0
    Спасибо за sugesstion, но ключи словаря должны быть сначала добавлены, а затем преобразованы в dataframe. есть разница между вашим выводом и моим ожидаемым выводом, так как вы можете видеть, что мои значения 'b' и 'c' повторяются в выводе
Показать ещё 11 комментариев
0

Использование перечисления

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':
['!', '!', '!', '!', '!', '!', '!', '!', '!', '!', '!', '!']}
  • 0
    Нет .. Пожалуйста, посмотрите ожидаемый результат
  • 0
    Как насчет этого ?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню