将Pandas Dataframe NaNs迭代并写入MySQL

2024-09-28 22:05:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将回归的结果写回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()

……我的回答是:

^{pr2}$

所以,我一直试图过滤掉NaN,只在yhat不等于NaN时请求Python提交:

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

然后尝试将ITEROWS()添加到这两个文件中,如:

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

但也有同样的问题。在

我不确定我在这里做错了什么,但假设这是在Pandas数据帧中迭代的结果。但是,即使迭代是正确的,我也希望在出现NaN的SQL中写入null。在

你觉得我该怎么做?在


Tags: indataframeforifupdatenanquerycursor
1条回答
网友
1楼 · 发布于 2024-09-28 22:05:08

我没有一个完整的答案,但也许我有一些建议可以帮助你。我相信您认为您的dataframe是一个类似于SQL记录集的对象。在

for i in dataframe

这将迭代dataframe中的列名字符串。i将采用列名,而不是行。在

^{pr2}$

这将返回整列(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']是一个完整的列)。在

另外,请注意熊猫有更好的方法来检查丢失的值,而不是依赖一个巨大的负数。试试这样的方法:

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)

希望有帮助。在

相关问题 更多 >