pandas 列选择实战:保留、删除与重命名列的 pandas 写法及与 SAS、Stata、电子表格的对照
2026/9/18 7:59:24 网站建设 项目流程

pandas 列选择实战:保留、删除与重命名列的 pandas 写法及与 SAS、Stata、电子表格的对照

【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas

本文聚焦 pandas 中三种最基本的列级操作——按标签保留列、删除列、重命名列,以官方对比文档中使用的tips数据集为贯穿示例,给出每种操作的 pandas 写法、等价于 SAS / Stata / 电子表格的对应做法,并结合 DataFrame.getitem、DataFrame.drop、DataFrame.rename 的源码实现,讲清这些操作在内部如何解析标签、返回新对象以及出错的边界条件。读完后你能在不同工具间自如翻译"列选择"需求,并理解 pandas 返回副本而非就地修改的设计约束。

1. 背景:三个对比文档共用的 tips 示例

includes/column_selection.rst 是 pandas 文档"与 SAS / Stata / 电子表格对比"系列中"Selection of columns"小节共用的 pandas 代码片段,它被三篇对比指南分别 include:

  • comparison_with_sas.rst:先讲 SAS 的DATA步骤关键字keep/drop/rename
  • comparison_with_stata.rst:先讲 Stata 的keep/drop/rename命令;
  • comparison_with_spreadsheets.rst:先讲电子表格中"隐藏列、删除列、跨表引用列范围、修改表头单元格文字"四种做法。

三篇文档均以tips(餐厅小费)数据集为对象,数据通过read_csv读入,原始文件即仓库测试数据 tips.csv。下文沿用该数据,依次演示"保留部分列、删除一列、重命名列"三个操作。

2. 操作一:保留指定列(Keep certain columns)

片段给出的 pandas 写法是:

tips[["sex", "total_bill", "tip"]]

即对 DataFrame 传入一个列标签列表,返回只含这些列的新 DataFrame。这里有两个值得注意的行为边界,均可从源码得到解释:

  1. 列表选择是严格匹配。在 DataFrame.getitem中,非单键路径先经check_dict_or_set_indexer(key)处理,随后对列表型 key 调用:

    indexer = self.columns._get_indexer_strict(key, "columns")[1]

    从源码结构看,_get_indexer_strict要求列表中每一个标签都必须真实存在于列索引中,否则抛出KeyError——这与 SAS 中keep了一个不存在的变量名会报错的行为一致,而不是静默忽略。最终结果通过self.take(indexer, axis=1)取列,且列的顺序按列表给定,与原表顺序无关。

  2. 单标签与列表标签返回类型不同。同一段__getitem__的前半部分(frame.py#L4280-L4292)有单键快速路径:当 key 可哈希且self.columns.get_loc(key)返回int(该标签唯一出现一次)时,直接return self._get_item(key),即tips["sex"]返回一个Series;而tips[["sex", "tip"]]返回列表型 key,走take路径,返回DataFrame。因此"保留单列"若想仍得到 DataFrame,需要写成tips[["sex"]]

3. 操作二:删除一列(Drop a column)

片段给出的写法是:

tips.drop("sex", axis=1)

axis=1表示从列轴移除标签sex,返回不含该列的新 DataFrame,原对象不变。

结合 drop 的函数签名与文档字符串,实际可用的参数比片段展示的更完整:

参数取值说明
labels单个标签或标签列表要删除的行/列标签;元组被视为单个标签而非可迭代对象
axis0/'index'1/'columns'从哪个轴删除,默认0(行)
index/columns标签或列表替代labels + axis的写法,df.drop(columns="sex")等价于df.drop("sex", axis=1)
levelint 或 level 名针对 MultiIndex,只从指定层删除标签
errors'raise'(默认)或'ignore''ignore'时静默跳过不存在的标签,其余标签照常删除

两个与当前仓库版本直接相关的注意点:

  • 返回新对象drop默认返回副本;文档字符串中inplace参数已标注自 3.1.0 起弃用、将在 pandas 4.0 移除(见 PDEP-8),所以新代码应始终写成tips = tips.drop("sex", axis=1)的形式,而不是依赖就地修改。
  • 缺失标签的行为由errors控制。默认'raise'下删除不存在的列会抛KeyErrorerrors="ignore"适合"若存在则删除"的防御式清洗。这与 SAS 的drop(变量不存在时仅警告)语义并不完全相同,跨工具迁移时需显式选择errors参数。

删除多列可合并为一次调用:tips.drop(["sex", "day"], axis=1)

4. 操作三:重命名列(Rename a column)

片段给出的写法是:

tips.rename(columns={"total_bill": "total_bill_2"})

columns接收一个{旧名: 新名}字典,返回列名替换后的新 DataFrame,未出现在字典中的列保持原名。DataFrame.rename 与drop同属"返回新对象"一族 API;若需同时重命名行索引,可另传index参数或mapper,此处只涉及列级重命名。

重命名一个常见的替代思路是直接替换列索引对象(tips.columns = [...]),但从仓库当前版本的inplace弃用方向(PDEP-8)来看,优先使用rename这类返回新对象的函数式写法更稳妥。

5. 跨工具对照:SAS / Stata / 电子表格中的同一批操作

includes/column_selection.rst存在的意义正是把三篇对比文档中的"列选择"章节统一为同一组 pandas 代码。将各工具原文与 pandas 写法并排对照如下。

SAS:DATA 步骤的 keep / drop / rename

comparison_with_sas.rst 中给出的 SAS 写法是:

data tips; set tips; keep sex total_bill tip; run; data tips; set tips; drop sex; run; data tips; set tips; rename total_bill=total_bill_2; run;

对应的 pandas 写法依次为tips[["sex", "total_bill", "tip"]]tips.drop("sex", axis=1)tips.rename(columns={"total_bill": "total_bill_2"})。SAS 的DATA步骤会生成新数据集,这与 pandas 三个操作都"返回新对象、不改原对象"的语义方向一致。

Stata:命令行 keep / drop / rename

comparison_with_stata.rst 中对应命令为:

keep sex total_bill tip drop sex rename total_bill total_bill_2

注意 Stata 的keepdrop就地作用于当前数据集的,而 pandas 的三个操作都返回新 DataFrame;从 Stata 迁移到 pandas 时,需要显式接收返回值(df = df.drop(...)),否则修改会"丢失"。

电子表格:隐藏、删除、引用与改表头

comparison_with_spreadsheets.rst 指出电子表格中"选择列"的常见手段有四种:隐藏列(不真删)、删除列、把某个工作表的一段列引用到另一张表、以及直接修改表头行第一个单元格的文字来完成重命名。pandas 侧的对应关系是:

  • "引用一段列到新工作表" →tips[["sex", "total_bill", "tip"]](列子集投影);
  • "删除列" →tips.drop("sex", axis=1)
  • "改表头文字" →tips.rename(columns={"total_bill": "total_bill_2"})

电子表格"隐藏列"并不移除数据,没有精确的 pandas 等价物;若目标是导出时少一列,直接用投影或drop更符合"数据即代码"的显式风格。

6. 小结与使用要点

把 includes/column_selection.rst 的三行操作归纳成一张速查表:

目的pandas 写法返回关键行为(源码依据)
保留部分列tips[["sex", "total_bill", "tip"]]新 DataFrame列表标签严格匹配,缺失即KeyError;结果列按列表排序(getitem
删除一列tips.drop("sex", axis=1)新 DataFrame可加errors="ignore"inplace已弃用(drop)
重命名列tips.rename(columns={"total_bill": "total_bill_2"})新 DataFrame字典式映射,未命名列不变(rename)

三条实践要点:

  1. 始终接收返回值。三个操作都不会修改原 DataFrame,且当前版本的inplace关键字已被弃用,链式接收(df = df.drop(...))是唯一推荐写法。
  2. 单列取 Series、多列取 DataFrametips["sex"]返回 Series,tips[["sex"]]返回 DataFrame,投影后继续做列操作时注意类型差异。
  3. 跨工具迁移时对齐"严格 vs 宽容"语义。SAS/Stata 中删除不存在的变量通常只是告警或报错,pandas 需通过errors="ignore"显式选择宽容模式;而列表取列则始终是严格匹配。

本文所有代码与行为描述基于当前仓库的文档与源码,可直接对照 comparison 系列文档 及 frame.py 进一步阅读。

【免费下载链接】pandasFlexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more项目地址: https://gitcode.com/gh_mirrors/pa/pandas

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询