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

什么好主意吗?


当前回答

只是给@安迪·海登的回答补充了一句:

因为DataFrame。mask是DataFrame的孪生兄弟。其中,它们具有完全相同的签名,但含义相反:

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

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

其他回答

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

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

只是给@安迪·海登的回答补充了一句:

因为DataFrame。mask是DataFrame的孪生兄弟。其中,它们具有完全相同的签名,但含义相反:

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

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

取代np。nan和None在不同版本的熊猫中完成的不同:

if version.parse(pd.__version__) >= version.parse('1.3.0'):
    df = df.replace({np.nan: None})
else:
    df = df.where(pd.notnull(df), None)

这解决了熊猫版本<1.3.0的问题,如果df中的值已经为None,则df.replace({np. replace)nan: None})将切换回np。Nan(反之亦然)。

经过一番摸索,这招对我很管用:

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

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

使用.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