【问题标题】:Why do I get this "fields not in fieldnames" error when writing Python dict to csv file?将 Python dict 写入 csv 文件时,为什么会出现“字段不在字段名中”错误?
【发布时间】:2017-07-09 14:09:48
【问题描述】:

我收到以下错误:

ValueError: dict contains fields not in fieldnames: 'R', '0', '0', '3'

当我运行这段示例代码时:

import csv
import pandas as pd

df = pd.DataFrame(
    data=[[   0,    0,    2,    5,    0],
          [1478, 3877, 3674, 2328, 2539],
          [1613, 4088, 3991, 6461, 2691],
          [1560, 3392, 3826, 4787, 2613],
          [1608, 4802, 3932, 4477, 2705],
          [1576, 3933, 3909, 4979, 2685],
          [  95,  229,  255,  496,  201],
          [   2,    0,    1,   27,    0],
          [1438, 3785, 3589, 4174, 2215],
          [1342, 4043, 4009, 4665, 3033]],
    index=['05-01-11', '05-02-11', '05-03-11', '05-04-11', '05-05-11',
           '05-06-11', '05-07-11', '05-08-11', '05-09-11', '05-10-11'],
    columns=['R003', 'R004', 'R005', 'R006', 'R007']
)

myDATA=df.to_dict();
header=myDATA.keys()

with open("TestTry.csv", "w") as g:
    writer = csv.DictWriter(g, delimiter=",", fieldnames=header,lineterminator='\r\n')
    writer.writeheader()
    for row in myDATA:
        writer.writerow(row)

我不知道如何克服这个错误!您的帮助将不胜感激。

【问题讨论】:

  • 您有什么理由不使用df.to_csv
  • 哎呀!我是 Python 的新手,忘记了:)。不过,由于我正在学习 Python,如果您能解释一下,了解导致错误的原因可能会有所帮助?
  • 您的writerDictWriter,其writerow 方法接受dictionary
  • @Tiny.D 如果您发布它,我会接受您的回答。请做。

标签: python python-2.7 csv dataframe export-to-csv


【解决方案1】:

正如@DeepSpace 建议的那样,您可以使用pandas df.to_csvdataframe 保存到csv 文件中。

您的代码问题是您必须将数据框转换为包含字典元素的列表,例如:list like [{column -> value}, ... , {column -> value}],然后您可以循环列表以将带有DictWriter的dict元素写入csv文件,同时,您也可以添加indexes,如下所示:

import csv
import pandas as pd

df = pd.DataFrame(
    data=[[   0,    0,    2,    5,    0],
          [1478, 3877, 3674, 2328, 2539],
          [1613, 4088, 3991, 6461, 2691],
          [1560, 3392, 3826, 4787, 2613],
          [1608, 4802, 3932, 4477, 2705],
          [1576, 3933, 3909, 4979, 2685],
          [  95,  229,  255,  496,  201],
          [   2,    0,    1,   27,    0],
          [1438, 3785, 3589, 4174, 2215],
          [1342, 4043, 4009, 4665, 3033]],
    index=['05-01-11', '05-02-11', '05-03-11', '05-04-11', '05-05-11',
           '05-06-11', '05-07-11', '05-08-11', '05-09-11', '05-10-11'],
    columns=['R003', 'R004', 'R005', 'R006', 'R007']
)

myDATA=df.to_dict(orient='records') #Convert DataFrame to dictionary(records) : list like [{column -> value}, ... , {column -> value}] 
header = list(df.columns.values) #get column name ['R003', 'R004', 'R005', 'R006', 'R007']
index = list(df.index) #get index name ['05-01-11', '05-02-11', '05-03-11', '05-04-11', '05-05-11', '05-06-11', '05-07-11', '05-08-11', '05-09-11', '05-10-11']

with open("TestTry.csv", "w") as g:
    writer = csv.DictWriter(g, delimiter=",", fieldnames=['index']+header,lineterminator='\r\n')
    writer.writeheader()
    for i,row in enumerate(myDATA):
        temp_row = row
        temp_row['index'] = index[i] #add index into dict
        writer.writerow(temp_row)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2014-04-04
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多