pandas to_csv将丢失NaN和None之间的信息



我想把pandas数据帧转换成CSV。如果我只使用to_csv,我得到:

>>> import pandas as pd
>>> df = pd.DataFrame.from_dict({"a": [1,2,3], 2: [2,3,float("NaN")], 3: ["a", None, "b"]})
>>> df
a    2     3
0  1  2.0     a
1  2  3.0  None
2  3  NaN     b
>>> df.to_csv(index=False)
'a,2,3n1,2.0,an2,3.0,n3,,bn'

我需要CSV有NaN,所以我最初做了以下操作:

>>> df.to_csv(index=False, na_rep="NaN")
'a,2,3n1,2.0,an2,3.0,NaNn3,NaN,bn'

但后来我意识到,在生成的CSV中,它也将None的映射到NaN的。我想区别对待NaN和Nones,但na_rep似乎在这两种类型之间丢失了信息。

这个上下文实际上并不需要,但我无论如何都会给出:我正试图使用需要CSV的COPY FROM将数据帧批量插入到postgres中。Postgres抱怨CSV中缺少的字段不是有效的数字类型,这意味着我需要正确映射NaN。

psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type double precision: """"

如果需要,可以将None转换为空字符串-将值转换为字符串并通过None进行比较:

df = df.mask(df.astype(str).eq('None') & df.isna(), '')
print (df.to_csv(index=False, na_rep="NaN"))
a,2,3
1,2.0,a
2,3.0,
3,NaN,b

由于要插入Postgres,其中nanNone都应该是NULL,因此可以执行以下操作:

df.to_csv('file.csv', na_rep='NULL')

最新更新