Python处理TCGA数据时多小数点字符串转float报错如何解决
解决方法
问题本质
你遇到的报错是因为该列数值存在多个小数点,其中靠前的小数点是千位分隔符,不符合Python float的格式要求。
方案1:正则快速替换(推荐)
直接通过正则匹配需要删除的千位分隔符小数点,规则完全符合你提出的「仅删除小数点后数字位数≤3位的小数点,保留后续位数>3位的小数点」要求:
import pandas as pd # 已通过pd.read_csv读入数据存为df df['reads_per_million_miRNA_mapped'] = df['reads_per_million_miRNA_mapped'].str.replace( pat=r'\.(?=\d{1,3}\.)', repl='', regex=True ).astype(float)
正则逻辑说明
(?=\d{1,3}\.)是正向预查规则:仅匹配后面紧跟1-3位数字+另一个小数点的小数点- 比如
1.024.089的第一个小数点符合匹配规则,会被删除,得到1024.089 - 比如
0.204818的小数点后无其他小数点,不会被匹配,保留原有格式
方案2:自定义函数兼容多小数点场景
如果数据中存在超过2个小数点的极端情况,可以用更稳妥的自定义拆分逻辑处理:
def format_mirna_count(s: str) -> str: parts = s.split('.') # 仅有一个小数点直接返回,多个小数点则仅保留最后一个 if len(parts) == 1: return s return ''.join(parts[:-1]) + '.' + parts[-1] df['reads_per_million_miRNA_mapped'] = df['reads_per_million_miRNA_mapped'].apply(format_mirna_count).astype(float)
处理效果验证
对你提供的样例数据处理后结果如下:
| miRNA_ID | read_count | reads_per_million_miRNA_mapped |
|---|---|---|
| hsa-mir-1227 | 1 | 0.204818 |
| hsa-mir-1228 | 5 | 1024.089 |
| hsa-mir-1229 | 12 | 2457.814 |
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

