熊猫将科学记数法中的浮点数转换为字符串

2024-06-02 05:39:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我用read_csv()加载了一个类似于

userid
NaN
1.091178e+11
1.137856e+11

我想把用户id转换成字符串。一种解决方案是将keep_default_na=False添加到read_csv()中,这是由此建议的:Converting long integers to strings in pandas (to avoid scientific notation)

假设我不想使用keep_default_na=False。有没有办法把用户id列转换成str

我试过df.userid.astype(str),结果1.091178e+11又回来了。我期待的结果是扩展的形式而不是科学的形式。

我该怎么办


Tags: csvto字符串用户idfalsedefaultread
2条回答

您可以使用^{}apply,如本comment中所述:

print (df.userid.map(lambda x: '{:.0f}'.format(x)))
0             nan
1    109117800000
2    113785600000
Name: userid, dtype: object

df.userid = df.userid.map(lambda x: '{:.0f}'.format(x))
print (df)
         userid
0           nan
1  109117800000
2  113785600000

我想知道map是否更快,但它是一样的:

#[300000 rows x 1 columns]
df = pd.concat([df]*100000).reset_index(drop=True)
#print (df)

In [40]: %timeit (df.userid.map(lambda x: '{:.0f}'.format(x)))
1 loop, best of 3: 211 ms per loop

In [41]: %timeit (df.userid.apply(lambda x: '{:.0f}'.format(x)))
1 loop, best of 3: 210 ms per loop

另一个解决方案是^{},但速度很慢:

print(df.userid.to_string(float_format='{:.0f}'.format))
0            nan
1   109117800000
2   113785600000

In [41]: (df.userid.to_string(float_format='{:.0f}'.format))
1 loop, best of 3: 2.52 s per loop

我在使用read_json方法从json文件读取数据帧后偶然发现了这个问题,不幸的是它没有keep_default_na参数。

解决方案是在将长浮点数转换为np.int64之前将其转换为str

In [53]: tweet_id_sample = tweets.iloc[0]['id']
         tweet_id_sample
Out[53]: 8.924206435553362e+17

In [54]: tweet_id_sample.astype(str)
Out[54]: '8.924206435553362e+17'

In [55]: tweet_id_sample.astype(np.int64).astype(str)
Out[55]: '892420643555336192'

In [56]: # This overflows
         tweet_id_sample.astype(int)
Out[56]: -2147483648

相关问题 更多 >