Python和SQL:用SQL的“Null”值替换DataFrame的空字符串,以将数据插入数据库中而不会出现格式错误[重复]

Posted

技术标签:

【中文标题】Python和SQL:用SQL的“Null”值替换DataFrame的空字符串,以将数据插入数据库中而不会出现格式错误[重复]【英文标题】:Python and SQL : replacing the empty strings of a DataFrame by a “Null” value of SQL to insert the data in a database without error of format [duplicate] 【发布时间】:2021-03-12 18:18:37 【问题描述】:

假设我有这个数据框和这个代码来将我的数据插入数据库:

import pandas as pd
import pyodbc 


REFERENCE = ["GZF882348G", "SFGUZBJLNJU", "FTLNGZ242112", "DFBHGVGHG543", "H353464508749","H353464508749","H353464508749","H353464508749", "H353464508749", "H353464508749", "H353464508749"]
IBAN = ["FR57476", "FR57476", "FR57476", "FR57476", "FR57476", "FR57476", " FR57476", "FR57476", "FR57476", "FR57476", "FR57476"]
DATE = ["2020-07-30", "2020-07-30", "2020-07-30", "2020-07-30", "2020-07-30", "2020-07-30", "2020-07-30", "2020-07-30", "2020-07-30", "2020-07-30", "2020-07-30"]
LIB = ["sdf", "dfsf", "dgsg", "dgfsg", "gsdg", "efsg", "efdg", "egsg", "gjtz", "wqeq", "hfgh"]
DEBIT = [289.2, 72.9, 709.23, 0, 97.3, 17.54, 40.32, 6.54, 1.74, '', 12401.04]
CREDIT = ['', '', '', '', '', '', '', '', '', 45, '']
BALANCE = [23.6,23.6,23.6,23.6,56.6,56,56,56,56,87,34]
B = ["CRDT", "CRDT", "CRDT", "CRDT", "DBIT", "DBIT", "DBIT", "DBIT", "DBIT", "CRDT", "DBIT"]
MONTANT = [-2819.2, -782.9, -709.23, 0, -9397.3, -1768.54, -1740.32, -676.54, -81.74, 16250, -12401.04]

df = pd.DataFrame('Réference' : REFERENCE, 'IBAN' : IBAN, 'Date' : DATE, 'Libelle' : LIB, 'Débit' : DEBIT, 'Crédit' : CREDIT, 'Balance' : BALANCE, 'Balance DrCr':B, 'Montant' : MONTANT)

df[['Débit', 'Crédit', 'Balance', 'Montant']] = df[['Débit', 'Crédit', 'Balance', 'Montant']].apply(pd.to_numeric)

###### -------- Connection -----------------

server = '...'
database = '...'
username = '...' 
password = '...'
driver = '...'

connection = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+password)
cursor = connection.cursor()

##### ------- Insert into ----------------

sql_exe = "INSERT INTO dbo.tbl_data_xml (Réference,IBAN,Date,Libelle,Débit,Crédit,Balance,[Balance DrCr],Montant) VALUES (?,?,?,?,?,?,?,?,?)"

# CONVERT DATA TO LIST OF NUMPY ARRAYS
sql_data = df.to_numpy().tolist()

# EXECUTE ACTION QUERY
cursor.executemany(sql_exe, sql_data)
connection.commit()

在我的数据库中插入此类数据时存在格式问题。 “Débit”、“Crédit”、“Balance”和“Montant”列被定义为获取浮点数作为数据。然而,这些列的数据不仅是整数,我也有空字符串,这是我的问题。我知道我必须编写一个条件,用 SQL 格式的“Null”值(SQL 中的 null 值)替换空字符串,但是我不知道如何在 python 或 SQL 中执行此操作。我正在发现/学习 SQL 环境。

我不知道我是否必须在sql中编写代码来替换这个值,或者我是否可以在python函数中这样做

有人有想法吗?

【问题讨论】:

【参考方案1】:

NaN 替换为None

sql_data = df.replace(np.nan:None).to_numpy().tolist()

【讨论】:

谢谢,终于成功了

以上是关于Python和SQL:用SQL的“Null”值替换DataFrame的空字符串,以将数据插入数据库中而不会出现格式错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server用最后一个值替换NULL [重复]

sql [sql]将多行合并并组合成一个,同时用其他数据替换NULL值。

当行丢失时,用 Oracle SQL PIVOT 结果中的自定义值替换 NULL

在 spark sql 中用无值替换 Null 值

有关sql 将null值转为空串类型的函数

SQL-字符串运算符和函数