首页 > 解决方案 > pandas to_csv 将丢失 NaN 和 None 之间的信息

问题描述

我想将熊猫数据框转换为 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,3\n1,2.0,a\n2,3.0,\n3,,b\n'

我需要 CSV 有NaN's 所以我最初做了以下事情:

>>> df.to_csv(index=False, na_rep="NaN")
'a,2,3\n1,2.0,a\n2,3.0,NaN\n3,NaN,b\n'

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

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

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

标签: pythonpandasdataframecsv

解决方案


如果需要转换None为空字符串,这个技巧是可能的 - 将值转换为字符串并按Nones 比较:

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

推荐阅读