Python 3.8+如何将Pandas中带单位的文件大小转字节以做运算?
处理Pandas中带单位的数值转换问题
现成库方案
如果不想自己写太多逻辑,可以用pint库——它专门处理带单位的数值计算,支持直接转换单位:
首先安装库:
pip install pint
然后写转换逻辑:
import pandas as pd from pint import UnitRegistry # 初始化单位注册表 ur = UnitRegistry() # 映射数据里的单位到pint的标准单位 unit_map = { 'K': ur.kilobyte, 'M': ur.megabyte, 'G': ur.gigabyte, 'B': ur.byte, '': ur.byte # 纯数字默认按字节算 } def convert_to_bytes(val): if isinstance(val, str): # 百分比直接保留 if '%' in val: return val # 拆分数字和单位部分 num_part = ''.join([c for c in val if c.isdigit() or c == '.']) unit_part = ''.join([c for c in val if c.isalpha()]) num = float(num_part) if num_part else 0.0 # 转换为字节并返回数值 return (num * unit_map.get(unit_part.upper(), ur.byte)).to(ur.byte).magnitude # 已经是数字的直接返回 return val # 应用到整个DataFrame df = df.applymap(convert_to_bytes)
轻量自定义实现(无额外依赖)
如果追求性能或者不想装新库,直接写个简单的映射函数就行,逻辑清晰还高效:
import pandas as pd # 定义单位换算系数(这里是二进制换算,1K=1024字节;如果要十进制就改成1000) unit_coeffs = { 'K': 1024, 'M': 1024**2, 'G': 1024**3, 'B': 1, '': 1 } def str_to_bytes(val): if isinstance(val, str): # 百分比不处理 if '%' in val: return val # 纯数字直接转成数值 if val.isdigit(): return int(val) # 找到单位开始的位置 split_idx = None for i, c in enumerate(val): if c.isalpha(): split_idx = i break # 没有单位的情况 if split_idx is None: return float(val) # 拆分数字和单位 num_str = val[:split_idx].strip() unit = val[split_idx:].strip().upper() num = float(num_str) # 计算字节数 return num * unit_coeffs.get(unit, 1) return val # 批量转换 df = df.applymap(str_to_bytes)
补充说明
- 换算标准:上面的代码用的是二进制换算(1GiB=1024MiB),如果需要十进制(1GB=1000MB),把
unit_coeffs里的1024改成1000即可。 - 性能对比:自定义函数因为逻辑简单,没有外部库的额外开销,处理大数据量时比
pint更快;pint胜在通用性强,支持更多复杂单位,适合扩展场景。
内容的提问来源于stack exchange,提问作者KyferEz
相关产品推荐
相关产品推荐

