Python - значения списка в пределах dict в виде нескольких столбцов в CSV-файле - PullRequest
0 голосов
/ 10 октября 2019

У меня есть вложенные dicts, которые имеют внутренний список в качестве значения, которое я пытаюсь экстраполировать в CSV-файл под несколькими именами столбцов. Диктовка выглядит следующим образом:

{'signal': {'chest': {'ACC': array([[ 0.95539999, -0.222     , -0.55799997],
       [ 0.92579997, -0.2216    , -0.55379999],
       [ 0.90820003, -0.21960002, -0.53920001],
       ...,
       [ 0.87179995, -0.12379998, -0.30419999],
       [ 0.87300003, -0.12339997, -0.30260003],
       [ 0.87020004, -0.12199998, -0.30220002]]), 'ECG': array([[ 0.02142334],
       [ 0.02032471],
       [ 0.01652527],
       ...,

Я написал код, чтобы сгладить его, чтобы каждый заголовок был: signal_chest_ACC, signal_chest_ECG и т. Д. Хотя и безобразно.

И я попытался обработатьЗначения каждого списка таковы, что они будут отображаться под каждым столбцом. Однако он выводит все значения в одном столбце, а не под соответствующими ключами. Как получить доступ к каждому индексу массива и вывести их в виде отдельной строки файла CSV, чтобы каждый ключ (заголовок столбца) имел соответствующий список значений в разделе?

#!/usr/bin/env python2

import sys
import numpy
import cPickle
import pandas as pd
import csv
import itertools

#numpy.set_printoptions(threshold=sys.maxsize)
with (open('S2.pkl', 'rb')) as openfile:
    data = cPickle.load(openfile)

    for key, value in data['signal'].items():
        data['signal_{}'.format(key)] = value
    del data['signal']

    for key, value in data['signal_wrist'].items():
        data['signal_wrist_{}'.format(key)] = value
    del data['signal_wrist']

    for key, value in data['signal_chest'].items():
        data['signal_chest_{}'.format(key)] = value
    del data['signal_chest']

    keys = sorted(data.keys())

    with open('out-testx.csv', 'wb') as csv_file:
        w = csv.writer(csv_file, delimiter = "\t")
        w.writerow(keys)
        for key in keys:
            for item in data[key]:
                w.writerow([item])

Пример вывода:

signal_chest_ACC    signal_chest_ECG    ...
[ 0.95539999, -0.222     , -0.55799997]
[ 0.92579997, -0.2216    , -0.55379999]
[ 0.90820003, -0.21960002, -0.53920001]
...
[ 0.02142334]
[ 0.02142334]
[ 0.01652527]
...

Желаемый выход:

signal_chest_ACC    signal_chest_ECG    ...
[ 0.95539999, -0.222     , -0.55799997]    [ 0.02142334]
[ 0.92579997, -0.2216    , -0.55379999]    [ 0.02142334]
[ 0.90820003, -0.21960002, -0.53920001]    [ 0.01652527]
...

1 Ответ

0 голосов
/ 10 октября 2019

Насколько я понял, вы хотите превратить вложенный словарь измерений разных ЭКГ и ACC в плоскую таблицу CSV. измерения ACC, ECG - упорядоченный список соответствующих значений. Я начал с кода, который вы предоставили, и внес некоторые изменения и включил комментарии, объясняющие каждый шаг.

Обратите внимание, что вы получаете один и тот же результат разными способами, но я выбрал что-то близкое к тому, с чего вы начали, и я сделалНе пытайтесь писать эффективный код или код Python, чтобы убедиться, что ответ ясен. Я пытаюсь сказать, что есть лучшие и более чистые способы получить тот же результат, но я пытаюсь здесь добиться максимальной ясности.

import cPickle
import csv

def fun():
 #load the pickled file and set the value to data
 with (open('S2.pkl', 'rb')) as openfile:
  data = cPickle.load(openfile)    

 #flatten the nested dictionary (depth 2) 
 for key0, value0 in data.items():
  for key1, value1 in data[key0].items():
   data['{}_{}'.format(key0, key1)] = value1
   for key2, value2 in data['{}_{}'.format(key0, key1)].items():
    data['{}_{}_{}'.format(key0, key1, key2)]=value2
   del data['{}_{}'.format(key0, key1)]
  del data[key0]

 #extract the flatten keys (useful for the csv)
 keys = sorted(data.keys())

 #Turn the dictionary into a table
 rows = []
 firstKey = keys[0]
 for index, value in enumerate(data[firstKey]):
  row = []
  for key in keys:
   row.append(data[key][index])
  rows.append(row)

 #Export datRows as csv
 with open('out-testx.csv', 'wb') as csv_file:
  w = csv.writer(csv_file, delimiter = "\t", lineterminator="\n")
  w.writerow(keys)
  for row in rows:
   w.writerow(row) 

if __name__=='__main__':
 fun()

Запуск кода (с доступными данными) приводит к:

signal_chest_ACC    signal_chest_ECG
[0.95539999, -0.222, -0.55799997]   [0.02142334]
[0.92579997, -0.2216, -0.55379999]  [0.02032471]
[0.90820003, -0.21960002, -0.53920001]  [0.02032471]
[0.87179995, -0.12379998, -0.30419999]  [0.02032471]
[0.87300003, -0.12339997, -0.30260003]  [0.02032471]
[0.87020004, -0.12199998, -0.30220002]  [0.01652527]

Удачи в анализе данных ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...