Python:使用多个标题行写入CSV 上下文

Python:使用多个标题行写入CSV 上下文,python,pandas,csv,dictionary,data-structures,Python,Pandas,Csv,Dictionary,Data Structures,我希望导出一个字典,其中包含一个字典列表,作为每个key:value对的值: 所需的输出将是一个.csv文件,其中第一个字典的键(键1、键2等)作为第一个标题行,然后嵌套字典的键(键a、键b等)作为第二个标题行,对应于其各自的键 所需输出的示例如下所示,其中列表索引列引用字典列表中每个索引处字典中存储的数据: ╔════════════╦═══════════════╤═══════════════╗ ║ ║ key_1 │ key_2 ║

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

所需的输出将是一个.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 ║
╚════════════╩═══════╧═══════╧═══════╧═══════╝
平台:树莓Pi 3b+,Python 3.6


代码 目前,我正在寻找不同的选项来实现这一点,所以没有任何一致的代码接近工作。然而,按照优先顺序,我正在考虑以下几个选项:

  • 使用pandas形成一个数组,该数组反映所需表的性质。然后直接将其写入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的最佳方法是什么?

到目前为止,我已经做到了:

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)
这给了你:

  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 
其余部分,您必须根据原始列名映射相应的键,tat可以作为标识符放置在
df1.loc[-1]
中。我会在得到一些东西后更新

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

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


b) Keep这是一个CSV,但正如anky_91建议的那样,有一个未融合的细胞

我在这里解决了一个类似的问题:@anky_91谢谢,这为使用熊猫来做这件事提供了一个很好的过程。但是有没有关于如何处理多个标题行的想法?这才是真正让我困惑的地方。这很有效,进一步研究后,我不确定是否可以根据需要创建第二个包含合并单元格的标题行。这是因为CSV不包含任何单元格样式信息,因此无法合并单元格。这意味着可能需要为每个顶级标题(键1、键2等)形成一个新的csv文件。我对任何替代方案都感兴趣。我不确定如何格式化或合并csv单元格,但我会尝试,看看是否能想出key1:key_a…etc映射:
  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