1

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

.....哪个SQL返回给我说:

 "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 写入出现 NaN 的 SQL 中。

那么,你觉得我应该怎么做呢?

4

1 回答 1

3

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

for i in dataframe

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

dataframe['yhat']

这将返回一整列(pandas.Series,即 a 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)

希望能帮助到你。

于 2013-02-06T20:15:59.947 回答