我还是 pandas 的新手。我有一个 Excel 文件,其中包含 700 多列和 600 行。我正在尝试将其拆分为多个数据帧,以便我可以将其插入到 sql 表中。我尝试拆分的原因是因为我收到一条错误消息,指出语句已终止。 (3621); [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]无法创建大小为 8349 的行,该行大于允许的最大行大小 8060。我想将每个数据帧拆分为 250 列,并且还需要第一行,这样我就可以将它加入到 SQL 中。
我无法指定数据框范围的另一个原因是,不同的 Excel 文件可能具有不同的列数。假设 Excel 文件包含 800 列,但我将其设置为 700: 850,它给我一个错误,提示 iloc 给出“IndexError: singlepositional indexer is out-of-bounds”。
如果有一种方法可以动态地将其分割为 250 行,那就太好了。下面是我的代码,它正在工作,但我需要指定索引的范围:
def sqlcol(dfparam):
dtypedict = {}
for i,j in zip(dfparam.columns, dfparam.dtypes):
if "object" in str(j):
dtypedict.update({i: sqla.types.NVARCHAR(length=255)})
if "datetime" in str(j):
dtypedict.update({i: sqla.types.DateTime()})
if "float" in str(j):
dtypedict.update({i: sqla.types.Float()})
if "int" in str(j):
dtypedict.update({i: sqla.types.BIGINT()})
if "decimal" in str(j):
dtypedict.update({i: sqla.types.DECIMAL()})
return dtypedict
def import_varchar_to_hst03(db:str,tb_name:str,df):
n= 1
import pandas as pd
import sqlalchemy as sqla
import urllib
import pyodbc
t=sqlcol(df1)
a=sqlcol(df2)
c=sqlcol(df3)
quoted = urllib.parse.quote_plus("DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE="+db+";Trusted_Connection=yes;")
engine = sqla.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted), fast_executemany = True)
df1.to_sql(tb_name, schema='dbo', con = engine, index=False,dtype=t,if_exists='replace')
df2.to_sql(tb_name + ( "A" * n), schema='dbo', con = engine, index=False,dtype=a,if_exists='replace')
df3.to_sql(tb_name + ( "B" * n), schema='dbo', con = engine, index=False,dtype=c,if_exists='replace')
import pandas as pd
import numpy as np
Ex=pd.read_excel(r'C:\Users\sriram.ramasamy\Desktop\Testsriram.xlsx',sheet_name=None)
for sh,v in Ex.items():
df=pd.DataFrame(v)
df1 = df.iloc[:,:255]
df2 = df.iloc[:,np.r_[0:1,256:500]]
df3 = df.iloc[:,np.r_[0:1,501:700]]
import_varchar_to_hst03('InsightMaster',sh,df)
print('data imported to database')
要将数据帧拆分为具有 n 列的子数据帧,请使用以下函数。它返回子数据帧的列表:
def SplittingDFtoSubDF(df,n):
DF_list =[]
for i in range(0,len(df.columns),n):
DF_list.append(df.iloc[:,i:i+n])
return DF_list
要将其与 255 列一起使用并获取拆分数据帧的列表,请使用:
DF_List = SplittingDFtoSubDF(Source_df,255)