我需要使用SQL Alchemy将数据帧从熊猫导出到Microsoft SQL Server。许多列都是字符串,具有缺失的值和一些非常长的整数,例如9999999999999999999999999999999999999。这些数字是某种外键,因此值本身并不意味着任何东西,因此我可以将其转换为字符串。
尝试导出到SQL时,这会在SQL Alchemy中导致以下错误:
OverflowError: int too big to convert
Run Code Online (Sandbox Code Playgroud)
我尝试使用astype(str)转换为字符串,但是随后遇到了一个问题,即标识为nans的缺失值被转换为字符串nan,因此SQL不会将其视为空值而是字符串nan。 。
我发现的唯一解决方案是先转换为str,然后用numpy.nan替换'nan'。有没有更好的办法?这很麻烦,相对较慢,并且可能会变得异常Python化:首先,我将所有内容都转换为字符串,将空值转换为字符串,然后将其转换为NaN,NaN只能是浮点数,最后得到一个混合型列。
还是我只需要简单地接受它,并接受熊猫对处理缺失值感到恐惧?
我有一个例子如下:
import numpy as np, pandas as pd, time
from sqlalchemy import create_engine, MetaData, Table, select
import sqlalchemy as sqlalchemy
start=time.time()
ServerName = "DESKTOP-MRX\SQLEXPRESS"
Database = 'MYDATABASE'
params = '?driver=SQL+Server+Native+Client+11.0'
engine = create_engine('mssql+pyodbc://' + ServerName + '/'+ Database + params, encoding ='latin1' )
conn=engine.connect()
df=pd.DataFrame()
df['mixed']=np.arange(0,9)
df.iloc[0,0]='test'
df['numb']=3.0
df['text']='my string'
df.iloc[0,2]=np.nan
df.iloc[1,2]=999999999999999999999999999999999
df['text']=df['text'].astype(str).replace('nan',np.nan)
print(df)
df.to_sql('test_df_mixed_types', engine, schema='dbo', if_exists='replace')
Run Code Online (Sandbox Code Playgroud) 我正在使用 Pandas 0.16 和 sqlalchemy。是否可以仅将数据帧的结构(即列名和数据类型,而不是行)导出到 SQL?
我设法做到的最接近的是仅导出第一行:
df.ix[[0],:].to_sql( tablename, myconnection )
Run Code Online (Sandbox Code Playgroud)
然后我必须做一个截断表。但是,to_csv 和 to_sql 方法之间存在不一致:to_csv 将布尔字段写为字符串 'TRUE' 或 'FALSE' ,而 to_sql 将它们写为 0 或 1。这意味着导入使用 dataframe.to_csv 创建的文件更复杂比应该的。
如果我跑
df.ix[[],:].to_sql( tablename, myconnection )
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为所有列都导出为文本。
注意:stackoverflow的bot认为该问题是主观的,但是非常事实-我在这里不要求意见!
假设我只有一个分支,而我的提交历史如下:A-B-C-D
如果我在GUI中单击C(例如GitKraken或Windows的Git)并执行“还原提交”,则会收到文件冲突消息。
两个问题:
这是因为还原“撤消”了在C中所做的更改,而GIT现在停留在B和D上了,它们以不同的不兼容方式修改了文件吗?那是原因吗?
如果是,这是否意味着您只能还原最近的提交?您能否在不造成冲突的情况下还原除上一次提交以外的其他提交?
更新:在@RomainValeri非常有用的澄清后,编辑问题。我认为我在恢复和重置之间造成了太多混乱。在下面的示例中,
git revert B
Run Code Online (Sandbox Code Playgroud)
使分支从
A-B-C-D
Run Code Online (Sandbox Code Playgroud)
至
A-B-C-D-E
Run Code Online (Sandbox Code Playgroud)
如果B是唯一更改了file2.txt的提交,并且B没有对其他文件进行任何其他更改,则还原后创建的新提交E将保留C和D中所做的所有更改,而不保留B中所做的所有更改。 。 它是否正确?
这是因为从技术上讲,还原意味着取消,撤消提交的任何更改-这是正确的吗?
另外:假设我的工作目录中只有一个文件。如果B是唯一更改文件中fun1()函数的提交,而所有其他提交都更改了同一文件中的其他函数,则还原B很可能会引起冲突,因为git会根据文件中的行来考虑,而不是文件中的功能。它是否正确?
假设B更改fun1(),C更改fun2(),D更改fun3()。然后,我意识到在fun1()的B处所做的更改是错误的,我需要撤消它们。如果所有这些功能都在同一个文件中,是否有办法撤消B中的更改,而同时保留C和D中的更改?
相反,如果这3个函数中的每一个都在单独的文件中,那么撤消一个提交的更改而不影响其他提交会更简单。
我想当然是单个文件不应太大或包含太多执行不同功能的函数的众多原因之一,对吗?
我有一个带有整数列的熊猫数据框,其中包含一些 nan。我想将它们从整数转换为字符串,并将 nans 替换为“不可用”之类的描述。
主要原因是因为我需要在该列上运行 groupbys,除非我转换 nans,否则 groupby 将摆脱它们!为什么会发生这种情况,以及整个大熊猫社区如何没有起立,这是一个完全不同的讨论(当我第一次了解到它时,我简直不敢相信......)。
我已经尝试了下面的代码,但它不起作用。请注意,我已经尝试过astype(str)
和astype('str'
)。在这两种情况下,列都被转换为对象,而不是字符串;也许是因为 Python 假设(错误地,它们在我的数据框中都具有相同的长度)字符串的长度不同?但是,最重要的是,fillna() 不起作用,而 nans 仍然是 nans!为什么?
import numpy as np
import pandas as pd
df= pd.DataFrame(np.random.randint(1,10,(10000,5)), columns=['a','b','c','d','e'])
df.iloc[0,0]=np.nan
df['a']=df['a'].astype(str)
df['a']=df['a'].fillna('not available')
print(df.dtypes)
print(df.head())
Run Code Online (Sandbox Code Playgroud) 在pandas数据框中,具有dtype = object的列实际上可以包含混合类型的项,例如整数和字符串.
在此示例中,列a是dtype对象,但第一个项是字符串,而所有其他项都是int:
import numpy as np, pandas as pd
df=pd.DataFrame()
df['a']=np.arange(0,9)
df.iloc[0,0]='test'
print(df.dtypes)
print(type(df.iloc[0,0]))
print(type(df.iloc[1,0]))
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有一种快速的方法来识别dtype = object包含哪些列,实际上是上面的混合类型?由于pandas没有dtype = str,因此不会立即显现出来.
但是,我遇到过将大型csv文件导入pandas的情况,我会收到如下警告:
sys:1: DtypeWarning: Columns (15,16) have mixed types. Specify dtype option on import or set low_memory=False
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来复制它并明确列出具有混合类型的列?或者我是否需要手动逐个浏览它们,看看我是否可以将它们转换为字符串等?
背景是我正在尝试使用DataFrame.to_sql和SQLAlchemy将数据框导出到Microsoft SQL Server.我得到了
OverflowError: int too big to convert
Run Code Online (Sandbox Code Playgroud)
但我的数据帧不包含dtype int的列 - 只有object和float64.我猜这是因为其中一个对象列必须同时包含字符串和整数.
谢谢!
我在我的本地计算机(Windows 7 PC)上运行 Microsoft SQL Server 2014 Express。
我使用 Python 并且可以使用 SQL 炼金术毫无问题地连接到服务器(从同一台 PC)。我还可以使用 Excel 和 PowerPivot 加载项进行连接。
但是,我无法连接 Pentaho - Kettle。
auth\x86\sqljdbc_auth.dll
并将其复制到同一个 lib 文件夹中。我拿了 x86 文件,而不是 x64,因为 Java 在c:\Program Files (x86)\Java\jre1.8.0_144\
我得到的错误信息是:
Error connecting to database [mydatabase] :org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the database
Error connecting to database: (using class com.microsoft.sqlserver.jdbc.SQLServerDriver) The …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 xlsx writer 将 matplotlib 图像直接写入 Excel 文件 - 理想情况下不将文件保存到磁盘。
我找到了这个答案:将 pandas/matplotlib 图像直接写入 XLSX 文件,但我无法让它工作,尤其是在 Python 3 中。
这:wks1.insert_image(2,2, imgdata
不起作用,因为:
路径应该是字符串、字节、os.PathLike 或整数,而不是 _io.BytesIO
这wks1.insert_image(2,2,"",{'image data': imgdata}
:) 发出警告
未找到图像文件“”。
并生成一个没有图表的excel文件。
什么工作是在本地保存文件 - 但我想了解是否有办法避免它。
fig.savefig('test.png', format='png')
wks1.insert_image(2,2, 'test.png')
Run Code Online (Sandbox Code Playgroud)
想法?完整代码是:
import xlsxwriter
import numpy as np
import matplotlib.pyplot as plt
import io
x=np.linspace(-10,10,100)
y=x**2
fig,ax=plt.subplots()
ax.plot(x,y)
workbook = xlsxwriter.Workbook('test chart.xlsx')
wks1=workbook.add_worksheet('Test chart')
wks1.write(0,0,'test')
imgdata=io.BytesIO()
fig.savefig(imgdata, format='png')
wks1.insert_image(2,2,"",{'image data': imgdata})
#wks1.insert_image(2,2, imgdata)
workbook.close()
Run Code Online (Sandbox Code Playgroud) 我正在尝试将 pandas 中的表导出到 Microsoft SQL Server Express 数据库。
Pandas 读取编码为 utf8 的 CSV 文件。如果我执行 df.head(),我可以看到 pandas 正确显示外文字符(它们是希腊字母)
但是,导出到 SQL 后,这些字符显示为问号和零的组合。
我究竟做错了什么?
我找不到 to_sql() 有任何设置编码的选项。我想我必须在设置 SQL 引擎时更改语法,但具体如何更改呢?
这就是我一直在尝试的:
import numpy as np
import pandas as pd
from sqlalchemy import create_engine, MetaData, Table, select
import sqlalchemy as sqlalchemy
ServerName = my_server_name
Database = my_database
params = '?driver=SQL+Server+Native+Client+11.0'
engine = create_engine('mssql+pyodbc://' + ServerName + '/'+ Database + params, encoding ='utf_8', fast_executemany=True )
connection = engine.raw_connection()
cursor = connection.cursor()
file_name = my_file_name
df = …
Run Code Online (Sandbox Code Playgroud) pandas ×5
python ×3
sql-server ×3
sqlalchemy ×3
dataframe ×2
nan ×2
fillna ×1
git ×1
git-revert ×1
heap-table ×1
jdbc ×1
kettle ×1
matplotlib ×1
pentaho ×1
python-3.x ×1
sql ×1
utf-8 ×1
xlsxwriter ×1