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

Che*_*eng 6 python pandas

我曾经read_csv()加载一个看起来像这样的数据集

userid
NaN
1.091178e+11
1.137856e+11
Run Code Online (Sandbox Code Playgroud)

我想将用户 ID 转换为字符串。一种解决方案是添加keep_default_na=Falseread_csv(),这是 SO 建议的:将长整数转换为熊猫中的字符串(以避免科学记数法)

假设我不想使用keep_default_na=False. 有什么方法可以将用户 ID 列转换为 str。

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

我该怎么办?

jez*_*ael 6

您可以使用mapapply,如本评论中所述

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

我想知道是否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
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是to_string,但速度很慢:

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
Run Code Online (Sandbox Code Playgroud)