十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

pandas 1.2.4 回归修复详解:min_count 求和、where 复制语义、NaT 比较与 ufunc 参数透传等 7 项关键变更

pandas 1.2.4 回归修复详解:min_count 求和、where 复制语义、NaT 比较与 ufunc 参数透传等 7 项关键变更 pandas 1.2.4 回归修复详解min_count 求和、where 复制语义、NaT 比较与 ufunc 参数透传等 7 项关键变更【免费下载链接】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 1.2.4 是 1.2.x 系列的一个 bugfix 补丁版本发布于 2021 年 4 月 12 日集中修复了上一版本引入的 7 个回归问题regression覆盖数值聚合、JSON 序列化、缺失值比较、条件筛选、正则替换、格式化输出与 NumPy ufunc 互操作等核心路径。读完本文你将逐条掌握这些回归的触发条件、修复后的预期行为以及仓库中对应的测试用例与源码位置可用于诊断升级 pandas 后遇到的同类问题。本文依据仓库中的官方变更说明 doc/source/whatsnew/v1.2.4.rst 整理该文档是 pandas 官方 changelog见 doc/source/whatsnew/index.rst 中 Version 1.2 一节的 v1.2.4 条目的组成部分文中的行为描述均可由仓库测试用例验证。版本背景什么是回归修复版本pandas 的发布策略中x.y.0 是功能版本x.y.zz0是补丁版本。1.2.4 作为 1.2 系列的第四个补丁版本不包含新功能只针对 1.2.0~1.2.3 期间因重构或新特性引入的行为退化进行修复。这类回归通常表现为旧版本可正常工作的调用在新版本抛异常如ValueError、AttributeError、IndexError返回值类型或形状发生变化标量 vs 数组视图/复制语义改变导致原数据被意外修改。升级建议如果你的项目正运行 1.2.x应优先升级到 1.2.4 或更高补丁版本若是更早版本如 1.1.x则需关注这些行为变更对代码的兼容性影响。回归修复一DataFrame.sum 的 min_count 参数不再误抛 ValueErrorGH#39738问题现象对DataFrame.sum(min_countN)传一个大于 DataFrame 形状的min_count时1.2.x 会抛出ValueError而正确行为是返回全为NaN的 Series。修复后的预期行为依据测试 pandas/tests/frame/test_reductions.pyimport pandas as pd import numpy as np df pd.DataFrame({x: [1, 2, 3], y: [4, 5, 6]}) result df.sum(min_count10) # x NaN # y NaN # dtype: float64底层原理min_count表示参与计算的非缺失值个数低于该值时结果直接返回NaN。当min_count大于列内元素总数时任何一列都无法满足条件因此每列都应为NaN。此前的实现错误地在列长度校验阶段直接抛出异常修复后改为正常走 nanops 路径返回NaN。值得注意的是对 timedelta 列test_sum_nanops_timedelta也遵循同一语义min_count1时含 NaN 的列结果为NaNmin_count0时结果为 0。回归修复二DataFrame.to_json 在 PyPy 上不再抛 AttributeErrorGH#39837问题现象在 PyPy 解释器下调用DataFrame.to_json()会抛出AttributeError。背景说明pandas 的 JSON 序列化走 pandas/io/json 模块底层使用 Cython 编译的加速函数。PyPy 与 CPython 在 C 扩展 ABI 和部分内建属性上的差异导致 1.2.x 在 PyPy 上无法正确访问序列化路径中的某个对象属性而报错。1.2.4 通过调整属性访问方式修复该回归。此问题仅在 PyPy 运行时出现CPython 用户不受影响修复后to_json在两类解释器上行为一致仓库中的 JSON 往返测试如 pandas/tests/io/json/test_json_table_schema.py 验证了read_json(StringIO(df.to_json()))的往返一致性。回归修复三pd.NaT 与非日期时间型 ndarray 比较时返回数组而非标量GH#40722问题现象pd.NaT np.array([...])其中数组不是日期时间类型如字符串、int、float 数组在 1.2.x 中错误地返回单个标量False而不是与数组等长的布尔数组。修复后的预期行为依据测试 pandas/tests/scalar/test_nat.pyimport pandas as pd import numpy as np arr np.array([foo] * 2, dtypeobject) # 也覆盖 int64 / float64 数组 result pd.NaT arr # array([False, False]) result pd.NaT ! arr # array([True, True])边界语义和!在修复后总是返回与输入等长的布尔数组NaT与任何值不相等因此全为False、!全为True而、、、这类顺序比较对非日期时间数组仍抛出TypeError提示not supported between instances of NaTType and ...这与日期类型之间NaT 可比较相等性但不可比较大小的设计一致。回归修复四DataFrame.where 全 True 条件时返回真正的副本GH#39595问题现象当where的 cond 条件全部为 True即不替换任何元素通常称为 no-op时1.2.x 的where返回的是原始对象的引用/视图而非副本导致对返回值做就地修改会意外改动原数据。修复后的预期行为依据测试 pandas/tests/frame/indexing/test_where.pyimport pandas as pd df pd.DataFrame([1, 2, 3, 4]) expected df.copy() res df.where(df[0] 5) # 条件全 True为 no-op res * 2 # 修改结果 pd.testing.assert_frame_equal(df, expected) # 原数据不受影响该测试同时覆盖了DataFrame与Series通过参数化的frame_or_series。修复后无论条件是否全 Truewhere都保证返回独立副本消除条件全真时共享内存的隐蔽陷阱。注意与此形成对照的是mask的inplaceTrue路径仍遵循 block 就地写回语义同一测试文件中 test_where_int_downcasting_deprecated 附近的注释。回归修复五DataFrame.replace 的 regex 多键字典不再抛 IndexErrorGH#39338问题现象当regex传入一个包含多个键的字典时键为待替换模式、值为替换内容1.2.x 会抛出IndexError。修复后的预期行为依据测试 pandas/tests/frame/methods/test_replace.pyimport pandas as pd import numpy as np df pd.DataFrame( { col1: [1,000, a, 3], col2: [a, , b], col3: [a, b, c], } ) to_replace {: np.nan, ,: } # 多键字典去掉逗号 空串转 NaN result df.replace(regexto_replace) # col1 col2 col3 # 0 1000 a a # 1 a NaN b # 2 3 b c要点测试特意参数化了字典键的两种顺序{: np.nan, ,: }与{,: , : np.nan}说明修复对键顺序不敏感replace(regexdict)与replace(dict, dict, regexTrue)、replace(regexdict, value..., inplaceTrue)三种调用形式结果一致。同文件还验证了元字符[]、()、\d等在非 regex 替换模式下按字面处理test_replace_regex_metachar以及空串正则^\s*$替换为pd.NA的字符串类型场景test_regex_replace_string_types。回归修复六object 列中浮点数的显示重新尊重 float_formatGH#40024问题现象当一个object类型列中混有浮点数如[1000.0, test]时控制台 repr 以及to_string、to_html、to_latex输出不再应用display.float_format/float_format参数导致格式不一致。修复后的预期行为依据测试 pandas/tests/io/formats/test_format.pyimport pandas as pd df pd.Series([1000.0, test]) with pd.option_context(display.float_format, {:,.0f}.format): result repr(df) # 0 1,000 # 1 test # dtype: object with pd.option_context(display.float_format, {:.4f}.format): result repr(df) # 0 1000.0000 # 1 test # dtype: object输出层面同样修复to_html(float_format...)在含 object 列时正确格式化浮点值pandas/tests/io/formats/test_to_html.pyto_latex的对应回归测试见 pandas/tests/io/formats/test_to_latex.py。这保证了混合类型列在全部四种输出途径repr、to_string、to_html、to_latex中的浮点格式行为一致。回归修复七NumPy ufunc 对 DataFrame 完整透传参数GH#40662问题现象对DataFrame调用 NumPy ufunc如np.add、np.subtract、np.power、np.negative时where、out等关键字参数未被完整透传到底层实现导致带where掩码或指定out的调用行为错误。修复后的预期行为依据测试 pandas/tests/frame/test_ufunc.pyimport numpy as np import pandas as pd from functools import partial arr np.array([[1, 2], [3, 4]]) df pd.DataFrame(arr) # 二元 ufunc where 掩码 result partial(np.add, where[[False, True], [True, False]])( df, np.array([[1, 1], [1, 1]]), outnp.zeros_like(arr) ) # result_inplace: [[0, 3], [4, 0]]同时结果也写回 out # 一元 ufuncnp.negative同样支持 where result partial(np.negative, wherenp.array([[False, True], [True, False]]))( df, outnp.zeros_like(arr) )修复后的语义是ufunc 的全部参数包括where掩码、out输出数组都被传递到元素级运算结果同时写回out参数指向的数组。相关的后续强化还验证了将DataFrame本身作为out传入np.fmin时结果正确写入且不递归pandas/tests/frame/test_ufunc.py。如何获取与验证该版本查看变更全貌官方 changelog 中该版本的完整条目见 doc/source/whatsnew/v1.2.4.rst其中还包含自 v1.2.3 起的所有贡献者名单Contributors一节。升级使用pip install pandas1.2.4或按 README.md 中的构建说明从源码构建。注意 1.2.4 发布于 2021 年仅支持当时主流的 Python 3.7~3.9 环境新项目建议直接使用仓库当前的更高版本。本地验证以上 7 个修复均有对应回归测试可在源码树中运行例如python -m pytest pandas/tests/frame/test_reductions.py -k min_count与python -m pytest pandas/tests/frame/test_ufunc.py -k ufunc_passes_args。小结pandas 1.2.4 虽是小版本却精准修复了 7 个影响面广泛的回归聚合参数的容错min_count、PyPy 兼容to_json、缺失值广播语义NaT 比较、复制语义安全where no-op、正则替换稳定性replace 多键字典、格式化输出一致性object 列浮点以及 NumPy 互操作完整性ufunc 参数透传。每项修复都能在仓库测试中找到对应的参数化用例为排查升级 pandas 后行为异常提供了明确的对照依据。如果你的代码恰好触及上述任一模式建议对照本文的预期行为检查结果必要时将依赖升级到包含这些修复的版本。【免费下载链接】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),仅供参考
返回列表