Python:使用多个标题行写入CSV 上下文
我希望导出一个字典,其中包含一个字典列表,作为每个key:value对的值: 所需的输出将是一个.csv文件,其中第一个字典的键(键1、键2等)作为第一个标题行,然后嵌套字典的键(键a、键b等)作为第二个标题行,对应于其各自的键 所需输出的示例如下所示,其中列表索引列引用字典列表中每个索引处字典中存储的数据: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_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