用null替换NaN,Python pandas

17 浏览
0 Comments

用null替换NaN,Python pandas

我正在尝试将pandas DataFrame中的数据写入AWS Redshift:

df_tmp_rpt = pd.read_csv('路径')
df_tmp_rpt = df_tmp_rpt[df_tmp_rpt['列名'] == '数值']
df_tmp_rpt = df_tmp_rpt.replace(np.nan, null, regex=True)
records = df_tmp_rpt.to_records(index=False)
for record in records:
     script_insert = ScriptReader.get_script(SCRIPT_PATH).format(record)
     RedshiftDataManager.run_update(script_insert, DB_CONNECTION)

Redshift期望插入数据的格式为('值1','值2',null)。这就是为什么我尝试将DataFrame中的所有NaN替换为null。我应该如何实现这样的操作?(我需要一个null值,而不是字符串'null')

提前感谢您的帮助。

0
0 Comments

问题的原因:

在Python中,没有空值(null)。而在AWS Redshift中,空值(null)表示值缺失或未知。因此,将NaN替换为空字符串可能有效。但是,对于整数字段,期望的是空值而不是空字符串。

解决方法:

考虑使用df_tmp_rpt.fillna(value=[None])来替换NaN,而不是使用replace()方法。可以参考pandas官方文档的fillna()方法的说明。

讨论:

根据对Amazon Redshift文档的阅读,将空字符串''视为null是不正确的。实际上,将空字符串''输入整数字段会导致错误,错误信息为:"invalid input syntax for integer: ''"。因此,需要将NaN替换为None,并确保Redshift能够识别None作为有效的数据类型。

解决方法的改进:

在代码中将NaN值替换为None的位置应该是:df_tmp_rpt.replace(np.nan, [None], inplace=True)。通过将None放入列表中,可以确保Redshift能够正确识别并接受None作为null值。

然而,即使将NaN替换为None,Redshift仍然不会将其识别为有效的数据类型,因为它需要的是空值(null)。因此,需要进一步处理以确保Redshift能够正确识别和接受None作为null值。

参考链接:

- https://docs.aws.amazon.com/redshift/latest/dg/r_Nulls.html(Amazon Redshift文档)

- stackoverflow.com/questions/17097236/…(Stack Overflow上的相关讨论)

以上是关于"Replacing NaN with null python pandas"问题的原因和解决方法的整理。

0
0 Comments

在处理Python Pandas的数据时,经常会遇到NaN(Not a Number)值的情况。NaN值表示缺少数据或无效数据,这可能会导致后续的数据分析和处理出现问题。因此,我们需要找到一种方法来替换这些NaN值。

解决这个问题的方法是使用Python Pandas中的where()函数。在这个具体的例子中,我们可以使用以下代码来实现将NaN值替换为NULL(None):

df_tmp_rpt = df_tmp_rpt.where(df_tmp_rpt.notna(), None)

这行代码的作用是将DataFrame中的所有NaN值替换为None。None在数据库中被加载为NULL。通过使用这个方法,我们可以确保数据在后续的处理过程中不会出现NaN值的问题,从而更好地进行数据分析和处理。

需要注意的是,这个方法在MS SQL中是有效的,但在其他数据库中可能会有所不同。因此,在使用时需要根据具体的数据库进行调整。

0