You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于小数部分值筛选Pandas DataFrame行:保留指定精度数据的高效实现方案

解决大DataFrame中保留精确到小数点后一位数值行的高效方法

嗨,我来帮你搞定这个问题!针对1GB+的大CSV文件,字符串操作(比如分割、正则)确实会慢到让人崩溃,而且你之前遇到的ValueError是因为对整个Series直接做布尔比较导致的,我给你推荐一个高效的纯数值运算方案,绝对比字符串处理快得多。

核心思路

我们要保留的是精确到小数点后一位的数值(包括像1111.100这种末尾补0的格式),这类数值有个特点:乘以10之后会变成整数。比如1111.1 * 10 = 11111,1111.100 *10=11111,而1111.234*10=11112.34不是整数。利用这个特点,我们可以用数值运算快速筛选出目标行,完全避开慢得离谱的字符串操作。

完整代码实现

import pandas as pd
import numpy as np

# 读取CSV文件,如果Value列是字符串类型,记得转成float;如果已经是数值类型可以去掉dtype参数
df = pd.read_csv("file.csv", dtype={"Value": float})

# 处理浮点数精度问题(比如1111.1可能被存储为1111.0999999999999),用np.isclose避免误判
mask = np.isclose((df['Value'] * 10) % 1, 0, atol=1e-9)

# 过滤得到符合要求的数据
df_filtered = df[mask]

# 保存结果到新CSV(可选)
df_filtered.to_csv("filtered_file.csv", index=False)

为什么这个方法更好?

  • 速度快:纯数值运算比字符串分割、正则表达式快几个数量级,完美适配1GB+的大文件。
  • 避免布尔歧义错误:生成的mask是一个布尔Series,直接用来索引DataFrame,不会触发ValueError。
  • 处理精度问题:用np.isclose可以解决浮点数存储的精度误差,防止本该保留的行被误删。

分析你之前的尝试问题

  1. Series.str.split():字符串操作在大文件上效率极低,因为要逐行解析字符串,远不如数值运算高效。
  2. 正则表达式str.filter():str.filter的参数应该是过滤函数,不是正则表达式,而且即使换成str.match,字符串处理还是慢,不适合大文件。
  3. math.modf的报错:0 < split < 1是对整个Series做布尔比较,Python无法判断整个Series的布尔值,正确的写法应该是(split >= 0) & (split < 1),但这个思路本身绕了弯路,不如直接用乘以10取模的方法简单高效。

测试验证

用你提供的示例数据测试:

Value Name
1111.1 Mark
1111.2 Mark
1111.234 Mark
1111.3 Mark
1111.346 Mark
1111.4 Mark

处理后得到的结果完全符合你的预期:

Value Name
1111.1 Mark
1111.2 Mark
1111.3 Mark
1111.4 Mark

内容的提问来源于stack exchange,提问作者Orkhan Mammadov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:39:04