Python:写入具有多个标题行的CSV文件

时间:2018-09-07 09:13:28

标签: python pandas csv dictionary data-structures

上下文

我要导出一个包含字典列表的字典,作为每个 key:value 对的值:

dict = {'key_1':
        [{'key_a': foo_1, 'key_b': bar_1}, 
         {'key_a': foo_2, 'key_b': bar_2}], 
        'key_2':
        [{'key_c': foo_1, 'key_d': bar_1}], 
         {'key_c': foo_2, 'key_d': bar_2}] 
        ...}

所需的输出将是一个.csv文件,该文件具有第一个字典的键(键_1,键_2等)作为第一标题行,然后是嵌套字典的键(键_a,键_b等)。 ,作为对应于其相应键的第二个标题行。

所需输出的示例如下所示,其中列表索引列引用字典中字典列表中每个相应索引处存储的数据:

╔════════════╦═══════════════╤═══════════════╗
║            ║     key_1     │     key_2     ║
║ List Index ╠═══════╤═══════╪═══════╤═══════╣
║            ║ key_a │ key_b │ key_c │ key_d ║
╠════════════╬═══════╪═══════╪═══════╪═══════╣
║     0      ║ foo_1 │ bar_1 │ foo_1 │ bar_1 ║
╟────────────╫───────┼───────┼───────┼───────╢
║     1      ║ foo_2 │ bar_2 │ foo_2 │ bar_2 ║
╟────────────╫───────┼───────┼───────┼───────╢
║     2      ║ foo_3 │ bar_3 │ foo_3 │ bar_3 ║
╚════════════╩═══════╧═══════╧═══════╧═══════╝
  

平台: Raspberry Pi 3b +,Python 3.6


代码

当前,我正在研究执行此操作的不同选项,因此没有任何连贯的代码可以正常工作。但是,按照优先顺序,我正在考虑以下几种选择:

  • 使用熊猫形成一个数组,该数组反映所需表的性质。然后将其直接写入CSV。

  • 从上述字典数据结构写入CSV。

    import csv
    
    field_names = dict.keys()
    header2 = {'%s' %dict.keys() : dict[key_1][0].keys()}
    
    with open('project_data.csv', 'a') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=field_names)
        writer.writeheader()  # Write header row containing the top field names
        writer.writerow(header2)  #Write row containing the second field names
    

    显而易见,此代码需要进一步开发才能使其按需工作。

  • 我没有考虑过的另一种方法?


问题

以这种格式写入CSV的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

到目前为止,我已经到达这里:

17.5 Reset Button

为您提供:

d = {'key_1':
    [{'key_a': 'foo_1', 'key_b': 'bar_1'}, 
     {'key_a': 'foo_2', 'key_b': 'bar_2'}], 
    'key_2':
    [{'key_c': 'foo_1', 'key_d': 'bar_1'}, 
     {'key_c': 'foo_2', 'key_d': 'bar_2'}]}
df = pd.DataFrame(d)
df1 = []
for col in df.columns:
    data = df[col].apply(pd.Series)
    data = df1.append(data)
df1 = pd.concat(df1,axis=1)
print(df1)

其他情况下,您必须根据原始列名映射各个键,并且tat可以作为标识符放置在 key_a key_b key_c key_d 0 foo_1 bar_1 foo_1 bar_1 1 foo_2 bar_2 foo_2 bar_2 中。知道后,我会更新。

答案 1 :(得分:1)

此处的“列表索引”是一个合并的单元格,您无法在CSV文件中实现此功能,因为它不包含格式。您可以:

a)将其写入xlsx文件(XlsxWriter是一个很棒的库)

b)保留为CSV,但如anky_91所建议的那样具有未合并的单元格