我试图写一个熊猫数据帧(或可以使用numpy数组)到mysql数据库使用MysqlDB。MysqlDB似乎不理解'nan',我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为NoneType。

什么好主意吗?


当前回答

你可以在numpy数组中用None替换nan:

>>> x = np.array([1, np.nan, 3])
>>> y = np.where(np.isnan(x), None, x)
>>> print y
[1.0 None 3.0]
>>> print type(y[1])
<type 'NoneType'>

其他回答

我相信最干净的方法是使用pandas. datafframe .to_numpy()方法中的na_value参数(docs):

na_value:任意,可选 用于缺失值的值。默认值取决于dtype和DataFrame列的dtypes。 1.1.0新版功能。

例如,你可以使用None替换NaN的字典

columns = df.columns.tolist()
dicts_with_nan_replaced = [
    dict(zip(columns, x))
    for x in df.to_numpy(na_value=None)
]

你可以在numpy数组中用None替换nan:

>>> x = np.array([1, np.nan, 3])
>>> y = np.where(np.isnan(x), None, x)
>>> print y
[1.0 None 3.0]
>>> print type(y[1])
<type 'NoneType'>

在替换为where语句之前,将numpy NaN转换为pandas NA:

df = df.replace(np.NaN, pd.NA).where(df.notnull(), None)

另一个补充:在替换倍数和将列的类型从object转换回float时要小心。如果你想确保你的None不会翻回np。NaN使用@andy-hayden的建议使用pd.where。 说明替换仍然可能出错:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.DataFrame({"a": [1, np.NAN, np.inf]})

In [4]: df
Out[4]:
     a
0  1.0
1  NaN
2  inf

In [5]: df.replace({np.NAN: None})
Out[5]:
      a
0     1
1  None
2   inf

In [6]: df.replace({np.NAN: None, np.inf: None})
Out[6]:
     a
0  1.0
1  NaN
2  NaN

In [7]: df.where((pd.notnull(df)), None).replace({np.inf: None})
Out[7]:
     a
0  1.0
1  NaN
2  NaN

您是否有代码块需要检查?

使用.loc, pandas可以基于逻辑条件(过滤)访问记录并对它们执行操作(当使用=时)。将.loc掩码设置为某个值将会就地改变返回数组(所以这里要小心;我建议在使用代码块之前测试一个df副本)。

df.loc[df['SomeColumn'].isna(), 'SomeColumn'] = None

外层的函数是df。loc[row_label, column_label] =无。我们将使用.isna()方法为row_label使用布尔掩码,在SomeColumn列中查找“NoneType”值。

我们将使用.isna()方法返回列SomeColumn中的行/记录布尔数组,作为我们的row_label: df['SomeColumn'].isna()。它将分离SomeColumn中含有熊猫用.isna()方法检查的任何'NoneType'项的所有行。

我们将在屏蔽row_label的数据帧时使用column_label,并在标识我们想要用于.loc掩码的列时使用column_label。

最后,我们将.loc掩码设置为None,因此返回的行/记录将根据掩码索引更改为None。

下面是关于.loc和.isna()的pandas文档链接。

引用: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.isna.html