在下面的示例中,good
和bad
被创建为具有相同的内容,但只有一个以我想要的方式导出到CSV:
>>> import pandas as pd
>>> good = pd.Series({'a': 1, 'b': 2, 'c': ''})
>>> good
a 1
b 2
c
dtype: object
>>> good.to_csv()
',0\na,1\nb,2\nc,\n' # ok
>>> bad = pd.Series({'a': 1, 'b': 2, 'c': float('nan')}).fillna('')
>>> bad
a 1
b 2
c
dtype: object
>>> bad.to_csv()
',0\na,1.0\nb,2.0\nc,\n' # ???
我知道熊猫does not support mixed int/nan Series and thus auto-promotes them to float,但是这里的两个系列都声称已经有了dtype对象!
这里特别令人沮丧的是,打印的数据与导出的数据有很大的不同,pandas.DataFrame.to_string
函数(由print
调用)涉及数据类型,而pandas.DataFrame.to_csv
函数不涉及数据类型。
同样的事情的另一个例子:
>>> row1 = pd.Series({'a': 1, 'b': 2}, dtype=object)
>>> row2 = pd.Series({'b': 2, 'c': 3}, dtype=object)
>>> pd.DataFrame([row1, row2], dtype=object).fillna('').to_csv()
',a,b,c\n0,1,2,\n1,,2,3\n' # ok
>>> row1['a'] = 42
>>> pd.DataFrame([row1, row2], dtype=object).fillna('').to_csv()
',a,b,c\n0,1,42,\n1,,2,3\n' # ok
>>> row1['b'] = 42
>>> pd.DataFrame([row1, row2], dtype=object).fillna('').to_csv()
',a,b,c\n0,42,42,\n1,,2,3\n' # ok
>>> row1[['a', 'b']] = [42, 42]
>>> pd.DataFrame([row1, row2], dtype=object).fillna('').to_csv()
',a,b,c\n0,42.0,42.0,\n1,,2.0,3\n' # ???
有没有理由让row1[['a', 'b']] = [42, 42]
的行为与row1['a'] = 42; row1['b'] = 42
不同呢?一般情况下,如何避免意外的浮点转换?
使用的版本: Python 3.7、pandas 1.1.3
发布于 2020-11-10 23:48:34
这并没有真正解决“为什么”的部分,但我找到了针对我的特定情况的变通方法。我认为尝试避免“破坏”DataFrame是一项徒劳的任务,所以我只是在导出之前修补我的DataFrame:
df_fixed = df.applymap(lambda cell: int(cell) if str(cell).endswith('.0') else cell)
>>> df.to_csv()
',a,b,c\n0,42.0,42.0,\n1,,2.0,3\n'
>>> df_fixed.to_csv()
',a,b,c\n0,42,42,\n1,,2,3\n'
https://stackoverflow.com/questions/64770882
复制相似问题