我想把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
,其中nan
和None
都应该是NULL
,因此可以执行以下操作:
df.to_csv('file.csv', na_rep='NULL')