如何修改现有Pandas代码实现指定列TB转GB统一单位后可直接求和
单位换算优化实现方案
当然可以在移除单位的同时完成单位换算,我们可以通过正则分组同时捕获数值与单位,再按单位匹配换算系数计算即可,调整后的完整代码如下:
import pandas as pd def removeend(): df = pd.read_csv('ExportList.csv') # 校验列是否包含目标单位,修正原代码多余空格的匹配问题 if df["Used Space"].str.contains(r"GB|TB").any() or df["Memory Size"].str.contains(r"GB|TB").any() or df["Host CPU"].str.contains(r"Hz|MHz|GHz").any(): # 批量处理存储类列,统一转换为GB单位 for col in ["Used Space", "Memory Size"]: # 分组捕获数值部分和单位部分 df[[f"{col}_num", f"{col}_unit"]] = df[col].str.extract(r"(\d+\.?\d*)(GB|TB)", expand=True) # 转换数值类型 df[f"{col}_num"] = pd.to_numeric(df[f"{col}_num"]) # 按单位计算统一单位后的数值 df[col] = df.apply( lambda x: x[f"{col}_num"] * 1024 if x[f"{col}_unit"] == "TB" else x[f"{col}_num"], axis=1 ) # 清理临时生成的辅助列 df.drop(columns=[f"{col}_num", f"{col}_unit"], inplace=True) # 处理Host CPU列,直接提取数值部分,可按需补充CPU单位换算逻辑 df["Host CPU"] = pd.to_numeric(df["Host CPU"].str.extract(r"(\d+\.?\d*)", expand=True)) # 统一转换数据类型 df = df.convert_dtypes() else: print("Error occured!!!") return df
主要改动说明
- 修正原代码匹配bug:原
str.contains规则中多余的空格会导致无法匹配无空格的单位标识,优化后已经移除空格 - 新增单位换算逻辑:不再直接删除单位字符串,通过正则分组同时捕获数值和单位,判断为TB时乘以1024换算为GB,最终返回统一单位的数值
- 代码复用性优化:批量处理两个存储类列,不需要重复写相同逻辑
- CPU列处理简化:通过
extract直接提取数值部分,比原替换所有单位的写法更简洁,若需要统一CPU单位可参照存储列的逻辑补充换算规则
内容的提问来源于stack exchange,提问作者Ielts Free
相关产品推荐
相关产品推荐

