Python 将Pandas或Numpy Nan替换为None以用于MysqlDB

Python 将Pandas或Numpy Nan替换为None以用于MysqlDB,python,pandas,numpy,mysql-python,Python,Pandas,Numpy,Mysql Python,我正在尝试使用MysqlDB将Pandas数据帧(或者可以使用numpy数组)写入mysql数据库。MysqlDB似乎不理解“nan”,我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为非类型 有什么想法吗 您可以将numpy数组中的nan替换为None: >>> x = np.array([1, np.nan, 3]) >>> y = np.where(np.isnan(x), None, x) >>> p

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


有什么想法吗

您可以将numpy数组中的
nan
替换为
None

>>> 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'>
>x=np.array([1,np.nan,3])
>>>y=np.where(np.isnan(x),无,x)
>>>打印y
[1.0无3.0]
>>>打印类型(y[1])

您可以将numpy阵列中的
nan
替换为
None

>>> 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'>
>x=np.array([1,np.nan,3])
>>>y=np.where(np.isnan(x),无,x)
>>>打印y
[1.0无3.0]
>>>打印类型(y[1])

@bogatron有它的权利,你可以使用,值得注意的是,你可以在熊猫身上实现这一点:

df1 = df.where(pd.notnull(df), None)
注意:这会将所有列的数据类型更改为
对象

例如:

In [1]: df = pd.DataFrame([1, np.nan])

In [2]: df
Out[2]: 
    0
0   1
1 NaN

In [3]: df1 = df.where(pd.notnull(df), None)

In [4]: df1
Out[4]: 
      0
0     1
1  None

注意:您无法执行的操作是:先使用数据帧方法,然后使用数据帧方法,重铸数据帧
dtype
,以允许所有数据类型:

不幸的是,这和使用都不适用于
None
请参阅


另一方面,值得注意的是,对于大多数用例,您不需要将NaN替换为None,请参见关于NaN的问题


但是,在这种情况下,您似乎是这样做的(至少在回答此问题时是这样)。

@bogatron有它的权利,您可以使用,值得注意的是,您可以在熊猫身上自然地这样做:

df1 = df.where(pd.notnull(df), None)
注意:这会将所有列的数据类型更改为
对象

例如:

In [1]: df = pd.DataFrame([1, np.nan])

In [2]: df
Out[2]: 
    0
0   1
1 NaN

In [3]: df1 = df.where(pd.notnull(df), None)

In [4]: df1
Out[4]: 
      0
0     1
1  None

注意:您无法执行的操作是:先使用数据帧方法,然后使用数据帧方法,重铸数据帧
dtype
,以允许所有数据类型:

不幸的是,这和使用都不适用于
None
请参阅


另一方面,值得注意的是,对于大多数用例,您不需要将NaN替换为None,请参见关于NaN的问题


然而,在这个特定的案例中,你似乎是这样做的(至少在回答这个问题时是这样)。

很老了,但我偶然发现了同样的问题。 尝试这样做:

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)

很老了,但我偶然发现了同样的问题。 尝试这样做:

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)

在跌跌撞撞之后,这对我起了作用:

df = df.astype(object).where(pd.notnull(df),None)

在跌跌撞撞之后,这对我起了作用:

df = df.astype(object).where(pd.notnull(df),None)
这家伙在这一天功不可没


归功于这家伙。

只是@Andy Hayden答案的补充:

因为是的孪生兄弟,它们的签名完全相同,但含义相反:

  • DataFrame.where
    用于替换条件为False的值
  • DataFrame.mask
    用于替换条件为True的值

因此,在这个问题中,使用
df.mask(df.isna(),other=None,inplace=True)
可能更直观。

只是@Andy Hayden答案的补充:

因为是的孪生兄弟,它们的签名完全相同,但含义相反:

  • DataFrame.where
    用于替换条件为False的值
  • DataFrame.mask
    用于替换条件为True的值

因此,在这个问题中,使用
df.mask(df.isna(),other=None,inplace=True)
可能更直观。

另一个补充:在替换倍数并将列类型从对象转换回浮点时要小心。如果你想确定你的
None
不会返回到
np.NaN
,请使用
pd.where
应用@andy hayden的建议。 替换仍可能“出错”的说明:

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

另一个补充:在替换倍数和将列类型从对象转换回浮点时要小心。如果你想确定你的
None
不会返回到
np.NaN
,请使用
pd.where
应用@andy hayden的建议。 替换仍可能“出错”的说明:

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

请参阅文档FWIW。这也会将列的数据类型更改为object,您可能不在乎though@Jeff谢谢你的链接,奇怪的是我之前找不到它!我想它必须将数据类型更改为不允许,这绝对值得一提!在插入Django之前使用非常有用,以避免将
np.nan
转换为字符串
“nan”
一个重要的用例是转换为JSON时。并非所有语言都支持JSON中的NAN(如PHP),因此需要将它们转换为None。这是我作为数据科学家经常遇到的问题。请参阅文档FWIW。这也会将列的数据类型更改为object,您可能不在乎though@Jeff谢谢你的链接,奇怪的是我之前找不到它!我想它必须将数据类型更改为不允许,这绝对值得一提!在插入Django之前使用非常有用,以避免将
np.nan
转换为字符串
“nan”
一个重要的用例是转换为JSON时。并非所有语言都支持JSON中的NAN(如PHP),因此需要将它们转换为None。这是我作为一名数据科学家经常遇到的问题。唯一潜在的问题是
dtype
x.dtype
dtype('float64')
,而
y.dtype
dtype('object')
。唯一潜在的问题是
dtype
x.dtype
dtype('float64')
,而
y.dtype
dtype('object')
。您是否可以在Pandas中更改设置,使其返回
None
,而不是
nan
?您是否可以在Pandas中更改设置,使其返回
None
,而不是
nan