如何给pandas DataFrame新增仅含单个分类值的列?
解决方案
疑问解答
- 不需要重复写三次
df["col"],有很多一行实现的简洁方案 - 你担心的中间内存占用问题确实存在:原有写法会先生成全量object类型的字符串列,峰值内存占用很高,有更高效的实现可以完全规避这个中间状态
最优实现方案
方法1:一行原生实现(最简洁,推荐)
直接创建指定dtype为category的Series赋值,全程没有中间object列生成:
df["col"] = pd.Series("hello", index=df.index, dtype="category")
这个方案的优势:
- 代码简洁,无额外依赖
- 底层直接生成category类型列,仅存储1次字符串值,所有行用整数编码指代,百万行级数据新增列的内存开销仅为几MB,完全避免中间大内存占用
- 自动匹配df的索引,不会出现行对齐问题
方法2:极致内存优化方案
如果数据量达到千万行以上,想要进一步压缩开销,可以直接通过编码构造Categorical对象,连字符串的重复遍历步骤都省略:
df["col"] = pd.Categorical.from_codes( codes = [0] * len(df), categories = ["hello"], ordered = False )
这个方案内存效率最高,所有分类值仅在categories列表中存储一次,直接指定所有行的编码为0,没有任何多余的字符串处理步骤。
关于你提到的itertools写法的说明
你写的df["col"] = pd.Categorical(itertools.repeat("hello", len(df)))内存表现其实也不错:itertools.repeat是惰性生成对象,不会预先构造全量字符串列表,pd.Categorical初始化时会自动去重识别唯一分类值,不会出现内存爆炸的问题。但相比原生写法多了itertools依赖,没有必要额外引入。
内容的提问来源于stack exchange,提问作者DustByte
相关产品推荐
相关产品推荐

