【发布时间】:2018-02-24 11:27:14
【问题描述】:
我有一个recurring problem,可以将 Python 中的大量数字保存到 csv。这些数字是毫秒纪元时间戳,我无法转换或截断,必须以这种格式保存。由于具有毫秒时间戳的列还包含一些 NaN 值,pandas 会自动将它们转换为浮点数(请参阅“支持整数 NA”下的陷阱中的 the documentation。
我似乎无法避免这种行为,所以我的问题是,如何在使用 df.to_csv 时将这些数字保存为整数值,即没有小数点或尾随零?我在同一个数据框中有不同浮动精度的列,我不想在那里丢失信息。在 to_csv 中使用 float_format 参数似乎对我的数据框中的所有浮点列应用相同的格式。
一个例子:
>>> df = pd.DataFrame({'a':[1.25, 2.54], 'b':[1424380449437, 1425510731187]})
>>> df['b'].dtype
Out[1]: dtype('int64')
>>> df.loc[2] = np.NaN
>>> df
Out[1]:
a b
0 1.25 1.424380e+12
1 2.54 1.425511e+12
2 NaN NaN
>>> df['b'].dtype
dtype('float64')
>>> df.to_csv('test.csv')
>>> with open ('test.csv') as f:
... for line in f:
... print(line)
,a,b
0,1.25,1.42438044944e+12
1,2.54,1.42551073119e+12
2,,
如您所见,我丢失了纪元时间戳的最后两位数字的精度。
【问题讨论】:
-
您可以将
nan值替换为零,然后将该列转换为整数。df.b = df.b.fillna(0).astype(int)或使用-1来识别后续处理中的条目。 -
这是一种可能,但是一种相当笨拙的解决方法。我更愿意保留
nan的值,因为它允许轻松索引和过滤。此外,我用于nan的任何占位符值都可能自然地出现在 Dataframe 中。