使用None替换Pandas或Numpy Nan以与MysqlDB一起使用

时间:2013-01-04 18:26:07

标签: python pandas numpy mysql-python

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

有什么想法吗?

8 个答案:

答案 0 :(得分:123)

@bogatron没错,你可以使用where,值得注意的是你可以在熊猫中原生这样做:

df1 = df.where((pd.notnull(df)), None)

注意:这会将所有列的dtype更改为object

示例:

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

注意:您无法使用astype重新构建DataFrames dtype以允许所有数据类型类型,然后使用DataFrame fillna方法:

df1 = df.astype(object).replace(np.nan, 'None')

很遗憾,使用None并使用{{1}}并不适用于{{1}},请参阅replace


顺便说一句,值得注意的是,对于大多数用例,您不需要将NaN替换为无,请参阅有关this (closed) issue的此问题。

但是,在这种特殊情况下,您似乎(至少在本回答时)。

答案 1 :(得分:19)

df = df.replace({pd.np.nan: None})

Github issue上给这个人信贷。

答案 2 :(得分:12)

您可以在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'>

答案 3 :(得分:8)

磕磕绊绊后,这对我有用:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

另一个补充:替换倍数并将列的类型从 object 转换回 float 时要小心。如果您想确定自己的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

答案 6 :(得分:0)

只是@Andy Hayden的答案的补充:

由于DataFrame.maskDataFrame.where的相反双胞胎,因此它们具有完全相同的签名,但含义相反:

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

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

答案 7 :(得分:0)

我认为最简洁的方法是在 na_value 方法 (docs) 中使用 pandas.DataFrame.to_numpy() 参数:

<块引用>

na_value:任意,可选

用于缺失值的值。默认值取决于 dtype 和 DataFrame 列的 dtypes。

1.1.0 版中的新功能。

你可以例如使用

将 NaN 替换为 None 的字典
columns = df.columns.tolist()
dicts_with_nan_replaced = [
    dict(zip(columns, x))
    for x in df.to_numpy(na_value=None)
]