Pandas列表转DataFrame时保留指定无名列数值尾随0并存为字符串
问题原因
你之前的写法不生效有两层原因:
- 核心问题:Python中直接书写的
1.257000这类数值字面量,会被首先解析为原生float浮点数类型,浮点数本身不会存储无意义的尾随小数0,也就是说在你把列表b传入pd.DataFrame之前,这些数值的尾随0就已经被丢弃了。后续即使指定列类型为字符串,也只是把已经丢失尾随0的浮点数转成字符串,不可能凭空恢复已经不存在的格式信息。 - 索引写错:你示例里带尾随0的数值实际在子列表的0基索引4位置(从1开始数是第5列),你指定
dtype={5:str}实际是给最后一个存string 6的列设类型,完全没匹配到目标列。
解决方案
核心原则是:在数据进入DataFrame之前,就把需要保留尾随0的列值以字符串形式存储,从源头保留格式信息,不要等pandas自动推断成浮点数之后再处理,根据你的数据来源场景选对应方式即可:
- 如果是手动构造源列表:直接把对应位置的数值写成字符串字面量,不要写浮点数
import pandas as pd b = [ ['string 1', 'string 2', 'string 3', 'string 4', '1.257000', 'string 6'], ['string 1', 'string 2', 'string 3', 'string 4', '1.546440', 'string 6'], ['string 1', 'string 2', 'string 3', 'string 4', '1.230', 'string 6'], ['string 1', 'string 2', 'string 3', 'string 4', '1.23000', 'string 6'], ['string 1', 'string 2', 'string 3', 'string 4', '1.2300000', 'string 6'] ] # 直接创建即可,对应列自动为字符串类型,任意长度的尾随0都能完整保留 df = pd.DataFrame(b)
- 如果是从csv、txt等外部文件读取数据:读取时就指定对应列为字符串类型,禁止pandas自动推断该列为浮点型
# 无表头时按0基索引指定列类型,数值列对应索引4 df = pd.read_csv("你的数据文件路径", header=None, dtype={4: str})
- 如果列表是其他代码逻辑动态生成的:在生成该列值的环节,直接格式化为你需要的字符串格式后再存入列表,不要存浮点数。比如生成值的时候按原始输出格式转成字符串,再append到列表里。
不要尝试创建DataFrame之后再通过浮点数字段格式化补0,你提到实际场景下该列小数位数不固定,补0规则无法统一,这种方式完全不可行。
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

