python - Python / SQL:用“Null”值替换DataFrame的空字符串以将数据插入数据库
问题描述
假设我有这个数据框:
REFERENCE = ["GZF882348G", "SFGUZBJLNJU", "FTLNGZ242112", "DFBHGVGHG543"]
IBAN = ["FR7343563", "FR4832545", "FR9858331", "FR2001045"]
DEBIT = [26, '', 856, '']
CREDIT = ['', 324, '', 876]
MONTANT = [641, 33, '', 968]
df = pd.DataFrame({'Référence' : REFERENCE, 'IBAN' : IBAN, 'Débit' : DEBIT, 'Crédit' : CREDIT, 'Montant' : MONTANT})
我在我的数据库中插入此类数据时遇到格式问题。“Débit”、“Crédit”、“Montant”列被定义为获取浮点数作为数据。然而,这些列的数据不仅是整数,我也有空字符串,这是我的问题。我知道我必须编写一个条件,用 SQL 格式的“Null”值替换空字符串,但是我不知道如何在 python 或 SQL 中做到这一点。我正在发现/学习 SQL 环境。
这是我的代码:
import pandas as pd
import pyodbc
server = '...'
database = '...'
username = '...'
password = '...'
driver = '...'
connection = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+password)
cursor = connection.cursor()
for i, row in df.iterrows():
sql_exe = "INSERT INTO dbo.tbl_data_xml (Réference,IBAN,Débit,Crédit,Montant) VALUES (?,?,?,?,?)"
cursor.execute(sql_exe, tuple(row))
connection.commit()
任何人都可以帮助我。
谢谢
解决方案
您似乎在 Pandas 数据框中混合类型,其中字符串 ,''
与同一列中的整数组合,所有object
类型都证明了这一点。在关系数据库中,您不能混合数据类型。并且转换''
为字符串'NULL'
不会解决您的问题。在 SQL 中,NULL <> 'NULL'
df.dtypes
# Référence object
# IBAN object
# Débit object
# Crédit object
# Montant object
# dtype: object
因此,将列转换为数字,pd.to_numeric
其中空字符串 ,''
转换NaN
为该实体应转换为 SQLNULL
实体的值。
df[['Débit', 'Crédit', 'Montant']] = df[['Débit', 'Crédit', 'Montant']].apply(pd.to_numeric)
df.dtypes
# Référence object
# IBAN object
# Débit float64
# Crédit float64
# Montant float64
# dtype: object
df
# Référence IBAN Débit Crédit Montant
# 0 GZF882348G FR7343563 26.0 NaN 641.0
# 1 SFGUZBJLNJU FR4832545 NaN 324.0 33.0
# 2 FTLNGZ242112 FR9858331 856.0 NaN NaN
# 3 DFBHGVGHG543 FR2001045 NaN 876.0 968.0
然后运行您的查询。事实上,避免较慢的for
循环iterrows
并考虑df.to_numpy
+ cursor.executemany
。
# PREPARED STATEMENT
sql_exe = "INSERT INTO dbo.tbl_data_xml (Réference,IBAN,Débit,Crédit,Montant) VALUES (?,?,?,?,?)"
# CONVERT DATA TO LIST OF NUMPY ARRAYS
sql_data = df.where(pd.notnull(df), None).to_numpy().replace(.tolist()
# EXECUTE ACTION QUERY
cursor.executemany(sql_exe, sql_data)
connection.commit()
推荐阅读
- java - Apache CXF 依赖项
- google-apps-script - TypeError:无法读取 null 的属性“getFormula”(第 3 行,文件“代码”)- URL FORMULA
- c# - 安装 .NET Core 全局工具时出错:“找不到路径的一部分...”
- java - Java 并行流未按预期工作
- c# - 如何使膨胀机的高度充满
- python - 如何使用 Selenium 从非选择下拉菜单中单击项目
- mysql - 使用 Mysql 根据 user_id 和时间戳选择用户的会话
- swift - 从文件系统上的文件设置 NSImage
- javascript - 为什么我的画布全屏时有边距?
- java - 在 Java 中测试覆盖的 EventHandler(JavaFx,Spring Boot)