Python DataFrame含M+后缀混合值转百万级数值修改不生效如何解决
问题根因
- 遍历
df.a时获取的循环变量i是列元素的临时副本,对i的修改不会回写到原DataFrame中,这是你修改不生效的核心原因。 - 直接循环遍历DataFrame元素的写法性能远低于Pandas自带的向量化操作,不推荐使用。
解决方法
可以用apply或者向量化字符串操作实现需求,两种实现方式如下:
方法1:自定义函数+apply(易读性高)
import pandas as pd import numpy as np def convert_a_col(s): s = s.strip() if s.endswith("M+"): # 提取M+前的数值,乘以100万后转整数 return int(float(s.removesuffix("M+")) * 1000000) else: # 去掉逗号后转整数 return int(s.replace(",", "")) # 将转换后的结果直接赋值回原a列 df["a"] = df["a"].apply(convert_a_col)
如果需要转换后保留3,500,000这种带千位分隔符的字符串格式,再追加一行代码即可:
df["a"] = df["a"].apply(lambda x: f"{x:,}")
方法2:向量化操作(性能更高,适合大数据量场景)
# 筛选出带M+后缀的行 m_mask = df["a"].str.endswith("M+") # 批量处理M+后缀的数值 df.loc[m_mask, "a"] = (df.loc[m_mask, "a"].str[:-2].astype(float) * 1000000).astype(int) # 批量处理剩余带逗号的数值 df.loc[~m_mask, "a"] = df.loc[~m_mask, "a"].str.replace(",", "").astype(int)
内容的提问来源于stack exchange,提问作者BMM925
相关产品推荐
相关产品推荐

