ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

pandas 列操作详解:向量化算术、新列赋值与列删除(对照 Stata / SAS / 电子表格)

pandas 列操作详解:向量化算术、新列赋值与列删除(对照 Stata / SAS / 电子表格) pandas 列操作详解向量化算术、新列赋值与列删除对照 Stata / SAS / 电子表格【免费下载链接】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/pandaspandas 的列操作是日常数据清洗中最基础也最高频的一类操作对整列做向量化算术运算、把计算结果写回为新列、以及删除不需要的列。本文基于 pandas 官方文档中用于跨语言对照的column_operations内容见 column_operations.rst并结合 pandas/core/frame.py 与 pandas/core/generic.py 的源码实现讲解这三类操作的完整用法、底层机制以及参数细节读完后可直接在 DataFrame 上独立完成改列、加列、删列的完整工作流。一、背景这段文档在 pandas 对照体系中的位置column_operations本身是一个被复用的 RST 片段它被包含在三个官方从其他工具迁移到 pandas的对照页中对比 Stata对比 SAS对比电子表格这三个页面对应的原生写法分别是replace total_bill total_bill - 2 generate new_bill total_bill / 2 drop new_billdata tips; set tips; total_bill total_bill - 2; new_bill total_bill / 2; run;在 Excel 等电子表格中则通常是在单个单元格写公式如A2-2再向下拖拽填充到整列。pandas 的差异在于无需逐单元格操作直接对整列即Series做运算即可。官方文档对核心机制的表述是pandas provides vectorized operations by specifying the individualSeriesin theDataFrame. New columns can be assigned in the same way. TheDataFrame.dropmethod drops a column from theDataFrame.对照 Stata 术语表见 comparison_with_stata.rstpandas 的列column对应 Stata 的变量variable行row对应观测值observation缺失值NaN对应 Stata 的.。因此熟悉 Statareplace/generate/drop三条命令的用户可以逐条映射到 pandas 的列赋值与drop。后文示例统一使用tips数据集。该文件就在当前仓库的测试数据目录中pandas/tests/io/data/csv/tips.csv列结构为total_bill, tip, sex, smoker, day, time, size共 244 行数据对照页通过pd.read_csv读取它作为示例数据源。二、对整列做向量化运算在 pandas 中用df[列名]取出的是一个Series。对该Series执行的算术表达式会逐元素向量化地作用于整列等价于 Stata 的replace/ SAS DATA 步中的列赋值 / 电子表格中把公式拖拽到整列但无需显式循环tips[total_bill] tips[total_bill] - 2这里右侧tips[total_bill] - 2返回一个与tips等长、索引对齐的新Series每行账单金额整体减 2。这就是指定DataFrame中的各个Series来做向量化运算的含义。三、把运算结果赋值为新列新列的创建方式与覆盖已有列完全相同——用df[列名] 值语法。文档示例中的完整工作流为tips[total_bill] tips[total_bill] - 2 # 覆盖已有列 tips[new_bill] tips[total_bill] / 2 # 基于修改后的列派生新列 tips # 查看结果 tips tips.drop(new_bill, axis1) # 删除新列两点值得注意语句顺序有语义依赖。new_bill是基于减 2 之后的total_bill计算的若调换前两行顺序结果会不同——这与 Stata 中replace后再generate的行为一致。__setitem__的列名语义。该赋值语法由 pandas/core/frame.py 中的DataFrame.__setitem__实现。从其 docstring 可以确认两条关键规则key为不存在的列名时会创建新列已存在时则覆盖该列右侧若为Seriespandas 按索引标签而非位置做对齐Series 中标签不存在于 DataFrame 索引的部分被忽略DataFrame 中标签不存在于 Series 的行会被填入NaN且 Series 内部行的顺序不影响结果。在本文示例中右侧tips[total_bill] / 2与tips本身索引完全一致因此对齐是平凡成立的但当右侧来自另一个数据集例如先groupby().transform()或从外部读入的Series时索引对齐语义就会真正发挥作用。对于链式派生多列的场景还可以使用 pandas/core/frame.py 中的DataFrame.assign它一次性派生多个新列并返回新对象不修改原 DataFrame适合函数式写法。四、用 DataFrame.drop 删除列DataFrame.drop是删除行或列的统一入口删除列时指定axis1或使用columns参数。方法定义位于 pandas/core/generic.py完整签名为def drop( self, labelsNone, *, axis0, indexNone, columnsNone, levelNone, inplaceFalse, errorsraise, ):各参数含义与源码约束依据上述实现逐一确认参数默认值说明labelsNone要删除的标签单个标签或列表。与index/columns互斥同时传入会抛ValueError(Cannot specify both labels and index/columns)axis0作用轴0/index删行1/columns删列index/columnsNone显式指定删除行标签 / 列标签与axis1同时传入会抛ValueErrorlevelNone仅对MultiIndex有效按层级删除inplaceFalseTrue时原地修改并返回NoneFalse时返回新对象errorsraiseraise时标签不存在抛KeyErrorignore时静默跳过三个约束至少给出labels、index、columns之一否则抛ValueError(Need to specify at least one of labels, index or columns)。因此文档示例中更等价的写法还有tips.drop(columnsnew_bill)或一次删除多列tips.drop([new_bill, tip], axis1)。底层实现_drop_axis与 reindex从源码结构看drop本身只做参数归一化真正的工作委托给私有方法_drop_axispandas/core/generic.py其流程为按axis取出对应轴列的Index对唯一索引DataFrame 的列名通常满足调用Index.drop(labels, errorserrors)生成新列索引再用axis.get_indexer(new_axis)计算保留哪些位置的 indexer调用底层BlockManager.reindex_indexer按 indexer 切片取出新列构造结果对象若inplaceTrue通过_update_inplace替换原对象内部状态。这也解释了文档示例为什么要写tips tips.drop(new_bill, axis1)而不是tips.drop(...)——默认inplaceFalsedrop返回的是新 DataFrame必须重新接收。五、对照速查表把 Stata / SAS / 电子表格 / pandas 四种写法放在一起方便迁移时逐条对照前三种写法摘自三个对照页操作StataSAS电子表格pandas修改已有列replace total_bill total_bill - 2total_bill total_bill - 2;DATA 步单元格公式并向下填充tips[total_bill] tips[total_bill] - 2派生新列generate new_bill total_bill / 2new_bill total_bill / 2;新列公式A2/2拖拽tips[new_bill] tips[total_bill] / 2删除列drop new_bill不keep该列或后续筛选删除整列tips tips.drop(new_bill, axis1)保留指定列keep sex total_bill tipkeep sex total_bill tip;选择性复制tips[[sex, total_bill, tip]]见 column_selection.rst重命名列rename total_bill total_bill_2rename total_billtotal_bill_2;重命名列头tips.rename(columns{total_bill: total_bill_2})六、小结pandas 列操作的三要素——向量化算术df[col]取出Series后运算、列赋值__setitem__不存在则建列Series右侧按索引对齐、DataFrame.drop删列axis1/columns支持errors与多标签批量删除——分别对应 Stata 的replace/generate/drop、SAS DATA 步赋值与keep、电子表格的公式填充与删列。三者组合即可覆盖绝大多数改列、加列、删列的清洗场景进一步的筛选、排序、保留/重命名等列级操作可参考 column_selection.rst 以及 comparison_with_stata.rst 中的 Selection of columns 一节。【免费下载链接】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),仅供参考
返回列表