如何阻止Pandas在复制操作中自动更改对象类型?
解决Pandas赋值/复制时整数转浮点的问题
核心原因
Pandas原生整数类型(如int64)无法容纳NaN值,只要列中存在NaN或赋值操作引入NaN,就会自动将列类型转为浮点型(float64)——这是问题的根源。
简便解决方案
1. 使用可空整数类型(Int64,注意大写I)
Pandas 0.24版本及以上支持可空整数类型,它既能存储整数,也能兼容NaN,不会自动转浮点:
- 创建数据框时直接指定类型:
import pandas as pd df = pd.DataFrame({'id': [1617, 1618, None], 'value': [100, 200, 300]}, dtype='Int64')
- 转换现有列:
df['id'] = df['id'].astype('Int64')
2. 批量转换所有列的类型
如果有大量列需要处理,用convert_dtypes()方法一键批量转换:
df = df.convert_dtypes()
这个方法会自动将适合的列转为可空类型(包括可空整数、可空字符串等),无需手动逐个处理。
3. 赋值操作时保持类型一致性
执行df[x] = df[y]这类操作前,确保源列df[y]是可空整数类型,或者直接在赋值时指定类型:
df['new_col'] = df['original_col'].astype('Int64')
4. 处理仅含NaN的列
全NaN的列默认是浮点型,直接转成可空整数即可:
df['empty_col'] = df['empty_col'].astype('Int64')
解决JSON序列化的.0问题
用可空整数类型后,json.dumps序列化时,整数会保留原格式,NaN会转为null,不会出现1617.0这类带小数的字符串:
import json json_str = json.dumps(df.to_dict('records')) # 输出示例:'[{"id":1617,"value":100,"new_col":1617},{"id":1618,"value":200,"new_col":1618},{"id":null,"value":300,"new_col":null}]'
内容的提问来源于stack exchange,提问作者Empusas
相关产品推荐
相关产品推荐

