如何将DataFrame中Bytes列的转换值覆盖回对应行?
解决Bytes列单位转换并覆盖原数据的问题
你当前的循环只是在临时变量i上做修改,根本没同步到原DataFrame里,所以原列不会有任何变化。下面给你几种可行的解决方法:
方法1:用apply函数(简洁直观)
写一个转换函数,用apply批量处理整列数据:
def convert_bytes(val): val_str = str(val) if "M" in val_str: return int(float(val_str.split()[0]) * 1000000) else: return int(val_str) # 直接覆盖原列 df1['Bytes'] = df1['Bytes'].apply(convert_bytes)
方法2:向量化操作(推荐给大型DataFrame)
向量化操作比循环和apply效率高得多,适合你说的大型CSV场景:
# 筛选出带'M'的行 has_m = df1['Bytes'].str.contains('M', na=False) # 处理带'M'的行:拆分取数值、转浮点、乘1000000 df1.loc[has_m, 'Bytes'] = df1.loc[has_m, 'Bytes'].str.split().str[0].astype(float) * 1000000 # 处理不带'M'的行:直接转整数 df1.loc[~has_m, 'Bytes'] = df1.loc[~has_m, 'Bytes'].astype(int) # 统一把整列转成int类型 df1['Bytes'] = df1['Bytes'].astype(int)
方法3:循环修改(不推荐大型数据)
如果非要用循环,得通过索引定位到原DataFrame的行来修改:
for idx, val in df1['Bytes'].items(): val_str = str(val) if "M" in val_str: df1.loc[idx, 'Bytes'] = int(float(val_str.split()[0]) * 1000000) else: df1.loc[idx, 'Bytes'] = int(val_str)
注意:如果你的数据里有
NaN或者其他异常格式,记得提前做清理,避免转换报错。
内容的提问来源于stack exchange,提问作者corey
相关产品推荐
相关产品推荐

