Python 将Pandas或Numpy Nan替换为None以用于MysqlDB
我正在尝试使用MysqlDB将Pandas数据帧(或者可以使用numpy数组)写入mysql数据库。MysqlDB似乎不理解“nan”,我的数据库抛出一个错误,说nan不在字段列表中。我需要找到一种方法将“nan”转换为非类型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
有什么想法吗 您可以将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答案的补充: 因为是的孪生兄弟,它们的签名完全相同,但含义相反:
用于替换条件为False的值李>DataFrame.where
用于替换条件为True的值DataFrame.mask
因此,在这个问题中,使用
df.mask(df.isna(),other=None,inplace=True)
可能更直观。只是@Andy Hayden答案的补充:
因为是的孪生兄弟,它们的签名完全相同,但含义相反:
用于替换条件为False的值李>DataFrame.where
用于替换条件为True的值DataFrame.mask
因此,在这个问题中,使用
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