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。这里有两个值得注意的行为边界,均可从源码得到解释:
列表选择是严格匹配。在 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)取列,且列的顺序按列表给定,与原表顺序无关。单标签与列表标签返回类型不同。同一段
__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 | 单个标签或标签列表 | 要删除的行/列标签;元组被视为单个标签而非可迭代对象 |
axis | 0/'index'或1/'columns' | 从哪个轴删除,默认0(行) |
index/columns | 标签或列表 | 替代labels + axis的写法,df.drop(columns="sex")等价于df.drop("sex", axis=1) |
level | int 或 level 名 | 针对 MultiIndex,只从指定层删除标签 |
errors | 'raise'(默认)或'ignore' | 'ignore'时静默跳过不存在的标签,其余标签照常删除 |
两个与当前仓库版本直接相关的注意点:
- 返回新对象。
drop默认返回副本;文档字符串中inplace参数已标注自 3.1.0 起弃用、将在 pandas 4.0 移除(见 PDEP-8),所以新代码应始终写成tips = tips.drop("sex", axis=1)的形式,而不是依赖就地修改。 - 缺失标签的行为由
errors控制。默认'raise'下删除不存在的列会抛KeyError;errors="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 的keep与drop是就地作用于当前数据集的,而 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) |
三条实践要点:
- 始终接收返回值。三个操作都不会修改原 DataFrame,且当前版本的
inplace关键字已被弃用,链式接收(df = df.drop(...))是唯一推荐写法。 - 单列取 Series、多列取 DataFrame。
tips["sex"]返回 Series,tips[["sex"]]返回 DataFrame,投影后继续做列操作时注意类型差异。 - 跨工具迁移时对齐"严格 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),仅供参考