Mysql 如何防止在使用to_sql时使用第一行数据框作为列名
我有一个从CSV文件加载的数据帧,其中包括一个标题行。从read_csv分配返回的数据帧后,我尝试使用SQLAlchemy引擎将行添加到MySQL数据库表中,我的方法调用如下所示: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,
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参数跳过标题