Python—dict中列表的值作为csv文件中的多列

Python—dict中列表的值作为csv文件中的多列,python,list,csv,dictionary,Python,List,Csv,Dictionary,我有一个嵌套的dict,它有一个内部列表作为一个值,我试图在多个列名下推断到一个csv文件。格言如下: {'signal': {'chest': {'ACC': array([[ 0.95539999, -0.222 , -0.55799997], [ 0.92579997, -0.2216 , -0.55379999], [ 0.90820003, -0.21960002, -0.53920001], ..., [ 0.87

我有一个嵌套的dict,它有一个内部列表作为一个值,我试图在多个列名下推断到一个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],
       ...,
我已经写了一些代码来平铺dict,这样每个标题都是:signal\u cheast\u ACC,signal\u chest\u 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]
...

据我所知,您希望将不同ECG和ACC测量的嵌套字典转换为一个平面csv表。ACC、ECG测量值按相应值的顺序排列。我从您提供的代码开始,做了一些更改,并加入了解释每个步骤的注释

请注意,您可以通过许多不同的方式获得相同的结果,但我选择了与您开始使用的方法相近的方法,并且我没有尝试编写高效的代码或pythonic代码来确保答案清晰。我想说的是,有更好更干净的方法来获得同样的结果,但我在这里试图最大限度地提高清晰度

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]

祝您分析数据时好运…

您提供的代码在最后一行代码中有明显错误,但我认为这不是您的问题。请提供一个测试输入数据文件,以及您正在使用的代码…@Ouss修复了拼写错误,我认为您可能是有意的,并上传了我正在使用的完整代码。输入数据文件很大,但它看起来像我上面显示的代码片段。。。这不仅仅是一个打字错误。。。ECG、ACC内的值将不会导出。。。[项目]将包含[ACC]和[ECG],而不是您想要的值。。。在此处或此处添加一些print()函数,以便可以找到逻辑错误。。。或者使用IDE调试代码。。。或者使用像Jupyter这样的工具,在那里你可以通过line@Ouss我已经添加了一个示例输出到它当前的样子。字面上不包含[ACC]和[ECG],但除了一列中的所有值之外,我想要的值与所需的HeaderOK不对应。我懂了。因此,原始文件中ACC数组的第一个元素与ECG数组的第一个元素相对应,它们应该在最终csv文件的同一行中导出?谢谢,尽管我认为键没有完全匹配的输出,因为我一直在获取索引器:行上的字符串索引超出范围。append(data[key][index]).我提供的代码与您提供的描述和数据一致。如果您提供的数据不能代表您手头的问题,那么我无法进一步帮助您。请共享数据文件或其中具有代表性的部分。。。