Python Словарь ключей с вложенным списком в панды DataFrame - PullRequest
0 голосов
/ 26 сентября 2018

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

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]]
}

Как преобразовать его в фрейм данных таким образом, чтобы

  • Столбцы из списков для ключа былив паре;вложенные списки - это значения времени, температуры и значения повреждений, соответственно, и в кадре данных они должны быть в отдельных столбцах.S для [[a1, a1, a1], [a2, a2, a2], [a3, a3, a3]], вы получите строку с a1, a2, a3 (первый столбец), за которой следует строка для 2-го столбца и т. Д.

  • Строки кадра данных сгруппированы покомбинируя клавиши со следующей клавишей, d1 в сочетании с d2 составляют 6 строк (3 из d1 и 3 из d2), затем d2 объединяется с d3, чтобы сделать еще 6 строк и т. д.Таким образом, для 4 клавиш по 3 строки в каждой вы получаете 3 комбинации по 6 строк == 18 строк.

Я попытался преобразовать данные в кадр данных перед объединением:

new_df = pd.DataFrame(list(D.values()), columns=['Time_sec', 'Temperature', 'Damage'])

, но я все еще застрял с объединяющей частью.

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

Expected output DataFrame

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы хотите 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:]):

>>> 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 голосов
/ 26 сентября 2018

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

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':
['!', '!', '!', '!', '!', '!', '!', '!', '!', '!', '!', '!']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...