You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:45:02