将指数符号数转换为字符串-说明

时间:2018-07-13 12:24:12

标签: python pandas casting floating-point integer

我有this questionDataFrame

temp=u"""Total,Price,test_num
0,71.7,2.04256e+14
1,39.5,2.04254e+14
2,82.2,2.04188e+14
3,42.9,2.04171e+14"""
df = pd.read_csv(pd.compat.StringIO(temp))

print (df)
   Total  Price      test_num
0      0   71.7  2.042560e+14
1      1   39.5  2.042540e+14
2      2   82.2  2.041880e+14
3      3   42.9  2.041710e+14

如果将float转换为string,则尾随0

print (df['test_num'].astype('str'))
0    204256000000000.0
1    204254000000000.0
2    204188000000000.0
3    204171000000000.0
Name: test_num, dtype: object

解决方案将float转换为integer64

print (df['test_num'].astype('int64'))
0    204256000000000
1    204254000000000
2    204188000000000
3    204171000000000
Name: test_num, dtype: int64

print (df['test_num'].astype('int64').astype(str))
0    204256000000000
1    204254000000000
2    204188000000000
3    204171000000000
Name: test_num, dtype: object

问题是为什么要这样转换?

我添加了这个糟糕的解释,但感觉应该更好:

糟糕的解释

您可以检查已转换列的dtype-返回float64

print (df['test_num'].dtype)
float64

转换为字符串后,它将删除指数符号并强制转换为float,因此添加了0

print (df['test_num'].astype('str'))
0    204256000000000.0
1    204254000000000.0
2    204188000000000.0
3    204171000000000.0
Name: test_num, dtype: object

1 个答案:

答案 0 :(得分:1)

当您使用pd.read_csv导入数据并且未定义数据类型时, 熊猫做出有根据的猜测,在这种情况下,决定那列 最好用浮点值表示“ 2.04256e + 14”之类的值。

此转换回字符串将添加一个“ .0”。当你写得很认真的时候, 转换为int64可以解决此问题。

如果您知道该列仅在输入之前具有int64值(并且 没有空值(np.int64无法处理),您可以在导入时强制使用此类型,以避免不必要的转换。

import numpy as np

temp=u"""Total,Price,test_num
0,71.7,2.04256e+14
1,39.5,2.04254e+14
2,82.2,2.04188e+14
3,42.9,2.04171e+14"""

df = pd.read_csv(pd.compat.StringIO(temp), dtype={2: np.int64})

print(df)

返回

   Total  Price         test_num
0      0   71.7  204256000000000
1      1   39.5  204254000000000
2      2   82.2  204188000000000
3      3   42.9  204171000000000