使用to_sql时如何防止使用第一行Pandas DataFrame作为列名

时间:2016-02-18 16:14:49

标签: mysql csv pandas

我有一个从CSV文件加载的数据框,其中包含标题行。从read_csv分配返回的数据帧后,我正在尝试使用SQLAlchemy引擎将行添加到MySQL数据库表中,我的方法调用如下所示:

my_dataframe.to_sql(name="my_table",
                    con=alch_engine,
                    if_exists="append",
                    chunksize=50,
                    index=False,
                    index_label=None)

但是,该表已经存在,并且dataframe标头的值与列名不匹配,因此我收到MySQL错误(1054,'field_list'中的“未知列'Col1'”)

我想根本不使用第一行并运行insert查询而不指定列名。我没有从Pandas手册中找到解决方案。

感谢您的帮助,

3 个答案:

答案 0 :(得分:3)

AFAIK你不能用.to_sql()做到这一点。但您可以修改数据框以匹配表中的列名称。如果db_cols是包含名称的列表/数组/系列/可迭代,则应执行以下操作:

(my_dataframe
 .rename(columns=dict(zip(df.columns, db_cols)))
 .to_sql(name="my_table",
         con=alch_engine,
         if_exists="append",
         chunksize=50,
         index=False,
         index_label=None))

答案 1 :(得分:0)

老..但是碰到这个..据我所知,当您首先创建数据框时,可以指定header = None ..那么该数据框没有列名,第一行被视为数据。 我只将它用于excel ..但我认为csv是相同的:

my_dataframe = pd.read_csv(full_path, header=None)

然后,当您使用to_sql时,它将没有列名。似乎熊猫试图将数字用作其insert语句的列名称。我想这取决于db引擎是否将其视为有效。 即它生成类似:

INSERT INTO [table] ( 0 , 1 ) VALUES (%(0)s, %(1)s)

[抱歉,不确定如何在此注释框中转义引号,以便在上面的列名周围显示它们]

答案 2 :(得分:0)

找到了解决这个问题的简单方法。

首先,阅读第一行,即标题并将其保存为列表(header_list)。

其次,创建一个 Dataframe 而不跳过任何行。不要使用 names 参数。

df = pandas.read_csv(input_file, quotechar='"', skiprows = skip_row_count, nrows = num_of_lines_per_iter)

这将创建以第一行作为表头的表,并将其余行作为数据插入。

第三,如果表存在,创建一个数据框,这次使用names参数。

df = pandas.read_csv(input_file, quotechar='"', skiprows=skip_row_count, nrows=num_of_lines_per_iter, names = header)

这将通过将数据框中的列名与表中的列名进行匹配来确保数据框中的数据插入到相应的列中。

最后,您可以使用 skiprows 参数跳过标题。