如何在Pandas DataFrame中筛选小于等于3072的数值型数据

11次阅读

如何在 Pandas DataFrame 中筛选小于等于 3072 的数值型数据

本文详解如何将字符串列安全转换为数值后,精准筛选出≤3072 的记录,并避免布尔掩码误用、类型转换异常等常见错误。

在使用 Pandas 处理磁盘空间等系统指标时,原始数据常以字符串形式存储(如 ‘158168’、’16’),而直接对字符串调用数值比较会报错或返回意外结果。用户尝试用 between() 生成布尔序列,却误将其直接赋值给列,导致得到的是 True/False 而非原始数值——这本质上混淆了 条件判断 数据筛选 两个步骤。

正确做法分为三步:类型转换 → 条件构造 → 布尔索引筛选。以下是推荐的实现方式:

✅ 方法一:loc + between()(推荐,清晰且高效)

# 安全转换并筛选:获取 Free Disk Space ≤ 3072 的所有原始字符串值(转为数值后满足条件)mask = pd.to_numeric(df['Free Disk Space'], errors='coerce').between(0, 3072, inclusive='both') result_series = df.loc[mask, 'Free Disk Space']

? inclusive=’both’ 等价于 ≤ 3072(即包含边界值 3072);errors=’coerce’ 将无法转换的值设为 NaN,避免中断流程。

✅ 方法二:query()(语法简洁,适合链式操作)

# 先添加临时数值列,再查询(推荐用于探索性分析)df_numeric = df.assign(_space_num=pd.to_numeric(df['Free Disk Space'], errors='coerce')) result_df = df_numeric.query('_space_num <= 3072')[['Free Disk Space']].copy()

✅ 方法三:直接数值比较(更直观,性能略优)

numeric_col = pd.to_numeric(df['Free Disk Space'], errors='coerce') result_series = df.loc[numeric_col <= 3072, 'Free Disk Space']

⚠️ 关键注意事项

  • ❌ 避免 df[‘col’] = condition 这类赋值——它会覆盖原列,而非筛选;
  • ❌ 不要省略 errors=’coerce’:若列含 ‘N/A’、’-‘ 或空字符串,pd.to_numeric() 默认抛 ValueError;
  • ✅ 若需保留原始字符串格式(如导出报表),筛选后无需 .astype(str) —— result_series 本身仍为原始字符串类型(因 df.loc[…] 返回视图 / 副本中的原值);
  • ? 如需同时获取整行记录(不止是该列),去掉列选择即可:df.loc[mask]。

? 扩展:处理单位混杂场景(如 ‘1.5GB’, ‘3072KB’)

若数据含单位,需先清洗再转换:

import re def parse_disk_size(s):     match = re.match(r'(d+.?d*)s*(w+)', str(s))     if not match: return float('nan')     num, unit = float(match.group(1)), match.group(2).upper()     factor = {'KB': 1, 'MB': 1024, 'GB': 1024**2}.get(unit, 1)     return num * factor  df['Space_KB'] = df['Free Disk Space'].apply(parse_disk_size) low_space_rows = df[df['Space_KB'] <= 3072]

掌握类型安全转换与布尔索引的分离逻辑,是 Pandas 数据筛选的基石。始终牢记:生成条件(布尔 Series)≠ 应用条件(.loc[])——二者缺一不可。

text=ZqhQzanResources