我有this question的DataFrame
:
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
答案 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