gpt4 book ai didi

python - 迭代 Pandas Dataframe NaN 并将其写回 MySQL

转载 作者:行者123 更新时间:2023-11-29 05:31:18 25 4
gpt4 key购买 nike

我试图将回归的结果写回 MySQL,但在迭代拟合值和让 NaN 写为空值时遇到问题。最初,我是这样进行迭代的:

for i in dataframe:
cur = cnx.cursor()
query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(dataframe['yhat'].__str__())+" where timecount="+(datafrane['timecount'].__str__())+";")
cur.execute(query)
cnx.commit()
cur.close()

..... which SQL thew back to me by saying:

 "mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NaN'

所以,我一直在尝试通过仅在 yhat 不等于 NaN 时要求 Python 提交来过滤掉 NaN:

for i in dataframe:
if cleandf['yhat']>(-1000):
cur = cnx.cursor()
query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(dataframe['yhat'].__str__())+" where timecount="+(datafrane['timecount'].__str__())+";")
cur.execute(query)
cnx.commit()
cur.close()

但后来我明白了:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

因此,我尝试在上面的语法中解决这个问题:

if cleandf['yhat'][i]>(-1000):

然后得到这个:

ValueError: Can only tuple-index with a MultiIndex

然后尝试将 itterows() 添加到两者中,如下所示:

 for i in dataframe.iterrows():
if cleandf['yhat'][i]>(-1000):

但是遇到和上面一样的问题。

我不确定我在这里做错了什么,但假设它与 Pandas DataFrames 中的迭代有关。但是,即使我得到了正确的迭代,我也想将 Null 写入 SQL 中出现 NaN 的地方。

那么,你认为我应该怎么做?

最佳答案

我没有完整的答案,但也许我有一些可能有用的提示。我相信您将 dataframe 视为类似于 SQL 记录集的对象。

for i in dataframe

这将遍历数据框中的列名字符串。 i 将采用列名,而不是行。

dataframe['yhat']

这会返回一整列(pandas.Series,它是一个 numpy.ndarray),而不是单个值。因此:

dataframe['yhat'].__str__()

将给出对人类阅读有用的整个列的字符串表示。它肯定不是可以为您的查询转换为字符串的单个值。

if cleandf['yhat']>(-1000)

这会产生错误,因为 cleandf['yhat'] 是一个完整的值数组,而不仅仅是一个值。将其视为一整列,而不是单行中的值。

if cleandf['yhat'][i]>(-1000):

这越来越接近了,但您真的希望 i 在这里是一个整数,而不是另一个列名。

for i in dataframe.iterrows():
if cleandf['yhat'][i]>(-1000):

使用 iterrows 似乎适合您。但是,i 取每一行的值,而不是一个可以索引到列中的整数(cleandf['yhat'] 是一个完整的列)。

此外,请注意,与依赖巨大的负数相比,pandas 有更好的方法来检查缺失值。尝试这样的事情:

non_missing_index = pandas.isnull(dataframe['yhat'])
cleandf = dataframe[non_missing_index]
for row in cleandf.iterrows():
row_index, row_values = row
query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(row_values['yhat'].__str__())+" where timecount="+(row_values['timecount'].__str__())+";")
execute_my_query(query)

我预计,您可以比我更好地实现 execute_my_query。但是,这个解决方案并不是您想要的。您真的想遍历所有行并执行两种类型的插入。试试这个:

for row in dataframe.iterrows():
row_index, row_values = row
if pandas.isnull(row_values['yhat']):
pass # populate the 'null' insert query here
else:
query = ("UPDATE Regression_Data.Input SET FITTEDVALUES="+(row_values['yhat'].__str__())+" where timecount="+(row_values['timecount'].__str__())+";")
execute_my_query(query)

希望对您有所帮助。

关于python - 迭代 Pandas Dataframe NaN 并将其写回 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14447925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com