FEATURED · 精选文章

pandas 0.14.1 版本解析:select_dtypes、sem 与 offsets.normalize 背后的设计演进

发布时间 / 2026/9/19 14:58:41
来源 / 创域科博编辑部
栏目 / 资讯中心
pandas 0.14.1 版本解析:select_dtypes、sem 与 offsets.normalize 背后的设计演进 pandas 0.14.1 版本解析select_dtypes、sem 与 offsets.normalize 背后的设计演进【免费下载链接】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 官方发布说明文档 doc/source/whatsnew/v0.14.1.rst 展开系统梳理 0.14.1 版本在 API 变更、新特性、性能优化与大量 Bug 修复上的关键决策。文章面向希望理解 pandas 数据类型选择、均值标准误计算、时间偏移offsets语义演化以及 C 文本解析器注释处理机制的开发者读完可获得对这些常用功能底层设计脉络与历史演进的全景式认知。版本背景0.14.0 之后的快速迭代pandas 0.14.1 于 2014 年 7 月 11 日发布是 0.14.0 之后的一个 minor release。官方发布说明即本仓库中的 v0.14.1.rst开篇即给出升级建议我们建议所有用户升级到该版本。该版本包含少量 API 变更其中部分属于破坏性行为调整如 offsets 默认保留时间多个新特性重点是DataFrame.select_dtypes与Series.sem若干性能改进与大量 Bug 修复。文档结构划分为五个核心板块API 变更API changes、增强Enhancements、性能Performance、实验性Experimental与 Bug 修复Bug fixes本文沿用这一脉络逐层深入。API 变更语义收敛与行为统一0.14.1 的 API 变更是该版本最具历史意义的部分它解决了一批不同对象行为不一致的历史遗留问题。offsets 时间偏移默认保留时间normalize 语义统一在 0.14.1 之前不同 offsets 在apply、rollforward、rollback操作中是否重置时间hour、minute 等行为不一致。以MonthEnd为例旧版本会隐式将时间归零# old behaviour 0.14.1 In [8]: d offsets.MonthEnd() Out[8]: pd.Timestamp(2014-01-31 00:00:00)从 0.14.1 起所有 offsets 默认保留时间normalizeFalse行为变为 d pd.Timestamp(2014-01-01 09:00) d offsets.MonthEnd() Timestamp(2014-01-31 09:00:00) d offsets.MonthEnd(normalizeTrue) Timestamp(2014-01-31 00:00:00)受此行为变化影响的 offsets 包括BusinessMonthBegin、MonthEnd、BusinessMonthEnd、CustomBusinessMonthEnd、BusinessYearBegin、LastWeekOfMonth、FY5253Quarter、Easter等其余 offsets 的默认行为不变。这一 API 设计在当前版本源码中得到了完整继承与固化。在 pandas/_libs/tslibs/offsets.pyx 中normalize作为所有偏移对象的核心属性被写入基类属性元组_attributes (n, normalize)其文档字符串明确说明normalize : bool, default False——频率是否与午夜对齐。底层apply逻辑通过_is_normalized()检查时分秒微秒是否全零并在计算完成后执行result.normalize()以支持归零语义同时当normalizeFalse且偏移不含纳秒分量时还会保留输入时间戳的纳秒信息见该文件 L164-L208 附近逻辑。这意味着默认保留时间不仅是一个文档约定更是 Cython 层面强制的行为契约。StringMethods.extract 空匹配结果的 dtype 修正StringMethods.extract在无匹配时结果将只含NaN。0.14.1 之前该结果 dtype 为float现在统一为object避免对无匹配结果做数值化误判便于与正常字符串提取结果保持一致。Period 的相等比较语义Period对象与非 Period 对象使用比较时不再抛出TypeError而是直接返回False。这一改动让Period在集合成员判断、掩码过滤等场景下表现得与其他标量类型一致。其他 API 修正openpyxl writer在构造 openpyxl writer 时直接抛出ValueError而不再是在 pandas import 时给出警告issue 7284——将错误前置到真正使用的位置。文本解析默认 NA 值回归修复重新加入#N/A N/A作为默认 NA 值issue 5521修复自 0.12 起的回归。inplace 语义收紧对.where使用非np.nan值进行 inplace 设置时抛出TypeError因为这与df[mask] None的 set-item 语义不一致issue 7656。新特性详解select_dtypes 与 semDataFrame.select_dtypes按 dtype 选择列select_dtypes是 0.14.1 引入的标志性新方法issue 7316允许根据列的数据类型筛选 DataFrame 子集。其当前实现位于 pandas/core/frame.py签名与语义如下DataFrame.select_dtypes(includeNone, excludeNone) - DataFrameinclude/exclude标量或类列表对象至少提供一个返回包含include中 dtype、排除exclude中 dtype 的列子集二者同时为空、或二者存在重叠元素时抛出ValueError传入字符串 dtype 时抛出TypeError。从当前 docstring 可以还原完整的选择规则族目标传参写法所有数值类型np.number或number字符串object 列object注意会选中所有 object 列日期时间np.datetime64、datetime、datetime64时间差np.timedelta64、timedelta、timedelta64指定精度如毫秒datetime64[ms]、timedelta64[ms]类别category时区感知 datetimepd.DatetimeTZDtype或datetime64[ns, US/Eastern]periodpd.PeriodDtype或period[D]关键语义区分一个具体的 dtype 实例如np.dtype(int32)只精确匹配该 dtype 的列而一个类或字符串则匹配整个 dtype 家族同时该文档对应的基础教程见 doc/source/user_guide/basics.rst 中的 selectdtypes 章节。 df pd.DataFrame( ... {a: [1, 2] * 3, b: [True, False] * 3, c: [1.0, 2.0] * 3} ... ) df.select_dtypes(includebool) # 仅返回布尔列 bSeries.sem均值标准误semstandard error of the mean均值标准误在 0.14.1 中落地issue 6897覆盖Series、DataFrame、Panel与Groupby四类对象。其定义为样本标准差除以样本量平方根sem std / sqrt(n)。在当前仓库中sem已扩展为覆盖几乎所有聚合入口的通用能力pandas/core/generic.py 中的NDFrame.sem基类实现pandas/core/series.py 中的Series.sempandas/core/groupby/groupby.py 中的GroupBy.sempandas/core/resample.py 中的Resampler.sempandas/core/window/rolling.py 与 pandas/core/window/expanding.py 中的滚动/扩展窗口版本。各实现统一接受ddof默认为 1对应样本标准差自由度修正、skipna、numeric_only、axis等参数并通过nanops底层数值内核完成计算。 s pd.Series([1.0, 2.0, 3.0, 4.0]) s.sem() # ddof1 的均值标准误 0.6454972243679028 s.sem(ddof0) # 总体语义 0.5590169943749475增强Enhancements0.14.1 的功能扩展全景文本解析注释支持与 NA 值read_csv与read_table现在可以通过comment参数忽略整行注释且允许数据开始前存在注释行issue 2685。C 解析器只接受单个字符作为注释符——这一约束在当前实现中依然成立pandas/_libs/parsers.pyx 中当comment长度大于 1 时直接抛出ValueError(Only length-1 comment characters supported)并将该字符通过ord()转为 C 层char传给底层解析器。这意味着comment#是合法用法而comment//会立即报错。 pd.read_csv(io.StringIO(# header line\na,b\n1,2\n), comment#) a b 0 1 2dateutil 时区支持0.14.1 为 pandas 全面引入 dateutil 时区issue 4688使其与 pytz 时区在date_range、Timestamp、DatetimeIndex等场景下可互换使用。写法为在时区字符串前加dateutil/前缀 rng pd.date_range( ... 3/6/2012 00:00, periods10, freqD, tzdateutil/Europe/London ... ) rng.tz tzfile(/usr/share/zoneinfo/Europe/London)由于 dateutil 基于系统 tzfile 数据库无需预装 pytz 即可支持本地时区规则。相关文档位于 doc/source/user_guide/timeseries.rst 的 timezone 章节。这也解释了该版本为何同时修复了大量与时区相关的 Bug见下文。字符串方法与 Period 相关增强StringMethods现在可以作用于空 Seriesissue 7242PeriodIndex的表示形式与DatetimeIndex统一issue 7601Period与PeriodIndex的值中可以包含NaTissue 7485PeriodIndex构造器对传入Series的回归已修复issue 7701。文件 IO 增强read_excel支持从 URL 读取issue 6809与read_csv行为对齐read_html新增encoding参数透传给底层解析库用于读取非 ASCII 编码网页issue 7323。该参数在当前实现 pandas/io/html.py 中依然存在并通过get_handle(..., encodingencoding)在读取阶段完成解码read_csv同时使用chunksize与nrows时抛出NotImplementedErrorissue 6774新增针对公共 S3 存储桶的基础读取测试issue 7281。聚合与统计能力补全value_counts与nunique新增dropna参数issue 5569用于控制缺失值的计入与否SeriesGroupBy的 allowlist 中加入nlargest与nsmallestissue 7053允许分组后直接取 Top-N。当前 pandas/core/frame.py 中nlargest/nsmallest仍通过selectn.SelectNFrame实现keep参数控制并列值的取舍策略first/last/all。 df pd.DataFrame({g: [x, x, y, y], v: [1, 5, 2, 9]}) df.groupby(g)[v].nlargest(1) g x 1 5 y 3 9 Name: v, dtype: int64其他增强所有 offsets 的apply、rollforward、rollback现在可以接受np.datetime64此前会抛出ApplyTypeErrorissue 7452非唯一标签的Series、DataFrame、Panel沿 item 轴index/columns/items可正常 picklingissue 7370改进含混合空对象的 datetime/timedelta 推断修复 0.13.1 引入的全空 object Index 解释回归issue 7431。性能改进数值推断与 transform 的加速0.14.1 的 Performance 板块记录了五个方向dtype 推断加速数值运算相关的 dtype 推断在int64、timedelta64、datetime64上带来性能收益issue 7223Series.transform 显著加速issue 6496DataFrame.transform 显著加速针对 ufunc 与内建 grouper 函数issue 7383groupby 聚合 datetime64 回归修复issue 7555MultiIndex.from_product 对大型可迭代对象提速issue 7627。由于发布说明未给出具体基准数字本文不虚构任何性能数据仅记录官方声明的能力方向与对应 issue。实验性模块IO 与金融数据访问重构pandas.io.data.Options新增get_all_data方法并统一返回 MultiIndexedDataFrameissue 5602为期权数据抓取提供一致的结构化输出。io.gbqGoogle BigQueryread_gbq与to_gbq被重构移除对 Googlebq.py命令行客户端的依赖改用httplib2与 Googleapiclient/oauth2client客户端库以获得更稳定的 API 访问issue 6937。相关文档见 doc/source/user_guide/io.rst 的 BigQuery 章节。Bug 修复全景按模块归类0.14.1 的 Bug 修复条目超过 90 项从源码结构与文档分类可以归为以下几大主题便于读者理解该版本重点加固的区域时间与日期时间占比最大DatetimeIndex.insert/asobject/delete不保留name、tz、freqissue 7299、7302DatetimeIndex与PeriodIndex转换to_period/to_timestamp对NaT与name处理错误issue 7228、7485DatetimeIndex比较与切片对NaT、负索引器、重复索引的处理issue 7529、7408、7523Timestamp.tz_localize与Timestamp.__new__丢失纳秒信息issue 7534、7610DatetimeIndex.freqstr在freqNone时抛出AttributeErrorissue 7606Easter偏移在负 offset 时返回错误日期issue 7195带tzinfo的输入在某些偏移的apply上被重置时区或抛ValueErrorissue 7465resample在目标含NaT、或fill_method被how忽略时行为错误issue 7227、2073TimeGrouper不排除key指定的列issue 7227。索引与 MultiIndexMultiIndex 切片在 datetimelike 范围、不完整索引器、带 step 的切片上的问题issue 7429、7399、7400.loc对单层 MultiIndex 传索引器列表、对 object dtype 索引回退整数索引的问题issue 7349、7496MultiIndex.append、concat、pivot_table不保留时区issue 6606NaT在 MultiIndex 中的 repr 错误issue 7406、7409Index.min/max对nan/NaT处理错误issue 7261PeriodIndex.min/max返回intissue 7609。统计与数值内核nanopsnanmedian在axisNone、以及多个 nanops 函数在 1 维数组axis0下的问题issue 7352、7354_maybe_null_out不支持复数issue 7353_has_infs不支持多种 dtypeissue 7357quantile忽略axis参数issue 7306滚动/扩展协方差与相关系数在索引不匹配的两个参数下出错issue 7512rolling_var在窗口大于数组时抛错issue 7297。绘图次坐标轴secondary_yTrue下折线图xlim错误issue 7459、时序图xlim由最后绘制的序列决定issue 2960、3490分组hist/scatter使用旧的figsize默认值、rot/sharex处理不当issue 7394、7234DataFrame.plot/boxplot子图模式下的ax清除与by参数ValueErrorissue 7391bar/barh 指定bottom/left时抛TypeErrorissue 7226DataFrame.hist含非数值列时抛TypeErrorissue 7277单列 bar 图错位issue 7498时区感知时序的 area 图抛ValueErrorissue 7471。数据操纵与 IODataFrame.where对称形状帧的other传入issue 7506replace替换 truthy 值与Period值的问题issue 7140、7379Series.get布尔访问器issue 7407Series.map元组键长度不同issue 7333DataFrame.reset_index丢失tzissue 3950to_sql将布尔列写入文本列issue 7678StataReader/StataWriter在 0 观测文件、Stata 13 定宽字符串、编码忽略等问题issue 7369、7360、7286read_sql在查询不含select时错误委派给read_sql_queryissue 7324。其他Float64Index不允许重复值、非标量索引器赋值问题issue 7149、7586isnull在use_inf_as_nullTrue时对inf不返回Trueissue 7315inferred_freq在东半球时区返回Noneissue 7310query/eval中带的局部字符串变量被误当临时变量删除issue 7300convert_objects将 bool 对象转为nanissue 7416Index.astype(float)返回 object dtypeissue 7464非单调Index.union的name保留错误issue 7458DatetimeIndex.intersection不保留时区issue 4690GroupBy.size由TimeGrouper创建时抛AttributeErrorissue 7453Panel.apply/Panel索引中的 MultiIndex 问题issue 7469、7516时间运算与非对齐 Seriesissue 7500、timedelta 推断与不完整 Series 赋值issue 7592、to_timedelta接受非法单位并误解m/hissue 7611、6423、groupby.nth的整数型列名issue 7559、value_counts中NaT未视为缺失issue 7423、setitem 的 list-of-lists 单值与混合类型issue 7551。升级建议与遗留约束综合发布说明0.14.1 的升级要点可归纳为三条行为变更先行确认若业务代码依赖MonthEnd等偏移在加法后时间归零需显式添加normalizeTrue否则结果将保留原时间分量。解析与 IO 行为更严谨comment仅支持单字符chunksize与nrows不可并用openpyxl 环境问题将在 writer 构造时直接暴露。统计语义统一sem默认ddof1与std保持一致的样本自由度约定。需要说明的是本仓库当前版本3.x 系列中的源码已历经十余年演进select_dtypes、sem、offsetsnormalize等 API 作为 0.14.1 引入的契约被完整保留至今但其内部实现细节与所属文件路径以当前仓库为准0.14.1 当时的实现细节与后续变化可结合 doc/source/whatsnew 目录下各版本发布说明纵向对比阅读。文中涉及的历史 issue 编号均转录自官方发布说明原文供追溯原始讨论使用。【免费下载链接】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),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻