Mysql 如何防止在使用to_sql时使用第一行数据框作为列名

Mysql 如何防止在使用to_sql时使用第一行数据框作为列名,mysql,csv,pandas,Mysql,Csv,Pandas,我有一个从CSV文件加载的数据帧,其中包括一个标题行。从read_csv分配返回的数据帧后,我尝试使用SQLAlchemy引擎将行添加到MySQL数据库表中,我的方法调用如下所示: my_dataframe.to_sql(name="my_table", con=alch_engine, if_exists="append", chunksize=50,

我有一个从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查询。我还没有从熊猫手册中找到解决方案


感谢您的帮助,

如果您不能使用
.to\u sql()
来实现这一点,请原谅。但是您可以修改dataframe以匹配表中的列名。如果
db_cols
是一个包含名称的列表/数组/系列/iterable,则应执行以下操作:

(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))

如果使用
.to\u sql()
,您就不能这样做。但是您可以修改dataframe以匹配表中的列名。如果
db_cols
是一个包含名称的列表/数组/系列/iterable,则应执行以下操作:

(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))

老。。但是我遇到了这个。。据我所知,当您首先创建数据帧时,可以指定header=None。。然后dataframe没有列名,第一行被视为数据。 我只在excel中使用过它。。但我假设csv是相同的:

my\u dataframe=pd.read\u csv(完整路径,标题=None)

然后,当您使用sql时,它将没有列名。熊猫似乎试图使用数字作为insert语句的列名。我想这取决于db引擎是否接受这一点。 也就是说,它会产生如下结果:

插入[表](
0
1
)值(%(0)s,%(1)s)


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

Old。。但是我遇到了这个。。据我所知,当您首先创建数据帧时,可以指定header=None。。然后dataframe没有列名,第一行被视为数据。 我只在excel中使用过它。。但我假设csv是相同的:

my\u dataframe=pd.read\u csv(完整路径,标题=None)

然后,当您使用sql时,它将没有列名。熊猫似乎试图使用数字作为insert语句的列名。我想这取决于db引擎是否接受这一点。 也就是说,它会产生如下结果:

插入[表](
0
1
)值(%(0)s,%(1)s)


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

找到了解决此问题的简单方法

首先,阅读第一行,即页眉,并将其保存为列表(页眉列表)

其次,在不跳过任何行的情况下创建数据帧。不要使用names参数

df = pandas.read_csv(input_file, quotechar='"', skiprows = skip_row_count, nrows = num_of_lines_per_iter)
df = pandas.read_csv(input_file, quotechar='"', skiprows=skip_row_count, nrows=num_of_lines_per_iter, names = header)
这将创建第一行作为表头的表,并插入其余行作为数据

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

df = pandas.read_csv(input_file, quotechar='"', skiprows = skip_row_count, nrows = num_of_lines_per_iter)
df = pandas.read_csv(input_file, quotechar='"', skiprows=skip_row_count, nrows=num_of_lines_per_iter, names = header)
这将确保通过将数据框中的列名与表中的列名相匹配,将数据框中的数据插入到相应的列中


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

找到了解决此问题的简单方法

首先,阅读第一行,即页眉,并将其保存为列表(页眉列表)

其次,在不跳过任何行的情况下创建数据帧。不要使用names参数

df = pandas.read_csv(input_file, quotechar='"', skiprows = skip_row_count, nrows = num_of_lines_per_iter)
df = pandas.read_csv(input_file, quotechar='"', skiprows=skip_row_count, nrows=num_of_lines_per_iter, names = header)
这将创建第一行作为表头的表,并插入其余行作为数据

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

df = pandas.read_csv(input_file, quotechar='"', skiprows = skip_row_count, nrows = num_of_lines_per_iter)
df = pandas.read_csv(input_file, quotechar='"', skiprows=skip_row_count, nrows=num_of_lines_per_iter, names = header)
这将确保通过将数据框中的列名与表中的列名相匹配,将数据框中的数据插入到相应的列中

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