迭代和编写Pandas Dataframe NaNs回MySQL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代和编写Pandas Dataframe NaNs回MySQL相关的知识,希望对你有一定的参考价值。
我试图将回归的结果写回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'
所以,我一直试图过滤掉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中迭代的东西。但是,即使我得到了正确的迭代,我也想把Nulls写入到NaN出现的SQL中。
那么,您认为我应该怎么做?
我没有完整的答案,但也许我有一些可能有用的提示。我相信您正在考虑将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)
希望能帮助到你。
以上是关于迭代和编写Pandas Dataframe NaNs回MySQL的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Dataframe 和 Series 连接返回空 Dataframe 或 NaN 列
pandas.DataFrame.describe() 与 numpy.percentile() NaN 处理
pandas.DataFrame.describe() 与 numpy.percentile() NaN 处理