
pandas 1.0 里程碑解读缺失值统一、StringDtype 与版本治理策略【免费下载链接】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/pandas2020 年 1 月 29 日pandas 正式发布 1.0.0。这既是一次普通的功能版本迭代也是项目十余年发展历程中的一座象征性里程碑。本文以官方博客 pandas-1.0.md 为主线结合仓库中完整的 v1.0.0 发布说明为你梳理 1.0 版本的技术内核——实验性的pd.NA缺失值标量、全新string字符串类型、可空布尔类型、以及面向未来的新弃用策略并回顾这个版本背后的社区与治理变革。一、为什么 1.0 是一个里程碑从碎片化生态到事实标准pandas 起步于 2011 年彼时科学 Python 生态处于碎片化状态统计学与数据科学领域还没有一个标准的、富语义的rich数据结构。这与 NumPy 当年整合各色数组实现的历史如出一辙。在随后的岁月里pandas 逐渐成为 Python 数据科学生态的de facto事实上标准——既被数据科学家和分析师直接使用也被大量上层库当作基础数据结构来构建。官方博客明确指出如今整个生态正处于新一轮的探索期多种新的 DataFrame 实现相继出现以填补 pandas 尚未覆盖的需求。pandas 团队正与这些项目协作共同确立富数据结构的共享标准与语义参见 2019 年 EuroSciPy 的 DataFrame Summit 相关工作。1.0 的象征意义值得注意的是1.0.0 发布时 pandas 代码库已近 12 年历史因此1.0.0这个版本号更多是一种象征它庆祝的是核心开发者团队与贡献者社区的成长。正如博客所言几乎没有开源项目是真正完成的pandas 亦然——团队承认 pandas 如今占据的关键地位并打算继续演进去适应全球数据工作者不断变化的需求。二、版本治理变革新的弃用策略从 1.0.0 开始pandas 采用 SemVer语义化版本的变体来管理版本发布这是本版本最重要的流程性变化详见 v1.0.0.rst New deprecation policy 一节弃用deprecation在次版本引入例如 1.1.0、1.2.0、2.1.0弃用在主版本强制执行例如 1.0.0、2.0.0、3.0.0破坏性 API 变更只发生在主版本实验性功能除外。同时官方强烈建议在升级到 pandas 1.0 之前先升级到 pandas 0.25并确保代码在无警告的情况下运行。因为 1.0 版本移除了大量此前版本已弃用的功能详见下文破坏性变更部分直接跨越式升级可能带来大量报错。三、实验性新特性缺失值语义的统一1.pd.NA统一的缺失值标量1.0 引入了一个新的单例值pd.NA用于表示标量缺失值。此前 pandas 中缺失值表示方式十分混乱浮点数据用np.nanobject-dtype 数据用np.nan或None时间日期类数据用pd.NaT。pd.NA的目标是提供一个可以跨数据类型一致使用的缺失指示器目前被可空整数类型、可空布尔类型以及新的字符串类型所使用。需要特别注意的是该特性处于实验阶段pd.NA的行为可能在没有警告的情况下发生变化。 s pd.Series([1, 2, None], dtypeInt64) s 0 1 1 2 2 NA dtype: Int64 s[2] NA与np.nan相比pd.NA在部分运算中行为不同。除算术运算外pd.NA在比较运算中也以缺失/未知的方式传播 np.nan 1 False pd.NA 1 NA在逻辑运算中pd.NA遵循三值逻辑Kleene logic规则 pd.NA | True Truepd.NA的实现定义在 Cython 层 pandas/_libs/missing.pyxclass NAType(C_NAType)与单例C_NA NAType()从源码结构可以推断其运算语义比较传播、逻辑三值化均由底层的NAType对象统一承载这正是它能跨类型保持一致缺失语义的机制基础。2.string专为字符串设计的 dtype1.0 新增了StringDtype扩展类型。此前字符串通常存储在 object-dtype 的 NumPy 数组中这带来三个问题详见 v1.0.0.rstobject-dtype 数组可能意外混入字符串与非字符串而StringArray只能存字符串object-dtype 会破坏依赖 dtype 的操作如DataFrame.select_dtypes无法干净地只选出文本列阅读代码时object-dtype 数组的内容不如string直观。用法如下dtypepd.StringDtype()与别名string等价 s pd.Series([abc, None, def], dtypestring) s 0 abc 1 NA 2 def dtype: string常规的字符串访问器方法照常工作返回的 Series 或 DataFrame 列会保持 string dtype返回整数的访问器方法则会返回Int64Dtype s.str.upper() 0 ABC 1 NA 2 DEF dtype: string s.str.split(b, expandTrue).dtypes 0 string 1 string dtype: object s.str.count(a) 0 1 1 NA 2 0官方建议在处理字符串时显式使用string数据类型。注意StringDtype目前同样被视为实验性其实现与部分 API 可能在没有警告的情况下变化。3.boolean可存缺失值的布尔类型BooleanDtype/BooleanArray是专为可容纳缺失值的布尔数据设计的扩展类型。默认基于 bool-dtype NumPy 数组的bool类型只能存True或False无法表示缺失而BooleanArray通过单独维护一个掩码mask来记录缺失值 pd.Series([True, False, None], dtypepd.BooleanDtype()) 0 True 1 False 2 NA dtype: boolean同样可以使用别名boolean。4.convert_dtypes一键切换到扩展 dtype为了推广支持pd.NA的扩展 dtypeStringDtype、BooleanDtype、Int64Dtype、Int32Dtype等1.0 引入了DataFrame.convert_dtypes与Series.convert_dtypes方法 df pd.DataFrame({x: [abc, None, def], ... y: [1, 2, np.nan], ... z: [True, False, True]}) df.dtypes x object y float64 z bool dtype: object converted df.convert_dtypes() converted.dtypes x string y Int64 z boolean dtype: object这在用read_csv、read_excel等读取数据后尤其有用可以一键把传统 dtype 转换到支持缺失值语义的扩展 dtype。四、常规增强性能与功能的双线推进1. Numba 引擎驱动rolling.apply/expanding.apply1.0 为Rolling.apply和Expanding.apply新增了engine关键字允许用户改用 Numba 而非 Cython 来执行函数。当 apply 函数能作用于 numpy 数组、且数据集较大约 100 万行以上时Numba 引擎可带来显著的性能提升。2. 自定义滚动窗口BaseIndexer新增pandas.api.indexers.BaseIndexer类允许用户自定义 rolling 操作中窗口边界的生成方式。用户可以在子类中实现自己的get_window_bounds方法生成每次滚动聚合所用窗口的起止索引。3.DataFrame.to_markdown输出 Markdown 表格 df pd.DataFrame({A: [1, 2, 3], B: [1, 2, 3]}, index[a, a, b]) print(df.to_markdown()) | | A | B | |:---|----:|----:| | a | 1 | 1 | | a | 2 | 2 | | b | 3 | 3 |4. 其他值得关注的增强DataFrame.to_string新增max_colwidth参数控制宽列截断Series/Index/DataFrame.to_numpy新增na_value参数指定缺失值转换值MultiIndex.from_product在未显式提供 names 时从输入推断层级名DataFrame.to_json新增indent整数参数支持 JSON 美化输出read_excel支持通过enginepyxlsb读取二进制 Excel.xlsb文件DataFrame.sort_values、sort_index、drop_duplicates新增ignore_index关键字read_json现在可解析NaN、Infinity和-Infinity新增实验性的DataFrame.attrs用于存放数据集的全局元数据DataFrame.to_pickle与read_pickle现在接受 URL。五、破坏性变更与旧功能移除升级必读1.0 移除了一大批此前已弃用的功能升级前务必对照检查移除SparseSeries、SparseDataFrame及DataFrame.to_sparse官方推荐改用带稀疏值的Series/DataFrame移除Series.ix与DataFrame.ix、Series.as_matrix/DataFrame.as_matrix、DataFrame.from_items、Series.ptp等一批老 API移除to_msgpack/read_msgpack移除DataFrame.get_value/set_value、Series.get_value/set_valueMatplotlib 单元注册行为变更pandas 不再因导入而副作用式注册 matplotlib 转换器需要时显式设置pd.options.plotting.matplotlib.register_converters TrueDataFrame.plot/Series.plot仍会自动注册MultiIndex层级名重构names 现在独立于 levels 存储mi.levels[0].name new name会抛出RuntimeError须改用MultiIndex.set_namesDataFrame.rename只接受一个位置参数同时传入mapper与index/columns会抛出TypeError应改用df.rename(index{...}, columns{...})DataFrame.info输出升级新增行号、Non-Null Count列与表格化格式pd.array推断行为变化字符串数据含缺失值返回StringArray整数数据含缺失值返回IntegerArray布尔数据含缺失值返回BooleanArrayIntegerArray改用pd.NA作为缺失值标记np.asarray(a, dtypefloat)会抛出ValueError须用a.to_numpy(dtypefloat, na_valuenp.nan)Series(a).sum(skipnaFalse)返回NA而非nanvalue_counts()返回可空整数 dtype比较操作返回BooleanArray且缺失值会传播而非恒为不等空Series默认 dtype 警告pd.Series()会发出DeprecationWarning未来默认 dtype 将从float64改为objectCategorical.min默认返回最小值而非np.nanskipnaTrue 时。版本与依赖门槛pandas 1.0.0 要求Python 3.6.1 及以上。核心依赖最低版本numpy 1.13.3、pytz 2015.4、python-dateutil 2.6.1均为必需可选依赖如 numba 0.46.0、pyarrow 0.13.0、openpyxl 2.5.7、fastparquet 0.3.2 等也有相应最低版本要求。构建方面pandas 新增了pyproject.toml且不再在 PyPI 源码发行版中包含 Cython 生成文件——从源码构建时无需再预先安装 Cython 即可执行pip install pandas。性能改进一览1.0 同步带来了大量性能优化包括DataFrame 与标量的算术/比较运算、非唯一IntervalIndex的索引、MultiIndex.is_monotonic、cut使用IntervalIndexbins、用range初始化 DataFrame、DataFrame.corr(methodspearman)、DataFrame.replace、向量化的select_dtypes、Index.equals/MultiIndex.equals等。六、社区与项目健康从志愿者到资金支持1.0 发布周期是 pandas 首次获得任何形式的赠款资助。pandas 通过 CZIChan Zuckerberg Initiative的Essential Open Source Software for ScienceEOSS计划获得资金支持。pandas 项目长期以来高度依赖志愿者贡献这些贡献由一部分获得雇主时间支持的核心维护者统筹详见机构合作伙伴列表。赠款中最大的工作项是库维护具体包括与社区成员协作处理大量积压的开放 issue 与 pull request。此外2019 年 pandas 还通过用户调查约 1250 份有效回复见 2019 用户调查博客指导开发方向调查显示扩展到大规模数据集是用户最关心的改进点其次是内存效率如原生字符串类型、减少内部拷贝——这些诉求在 1.0 的stringdtype、Numba 引擎等特性中已初见端倪。七、面向未来1.0 只是新阶段的起点。项目的 路线图 列出了未来几年的发展方向包括与生态中其他 DataFrame 实现协作确立共享标准等议题。对普通用户而言最重要的行动是先升级到 0.25清理代码中的所有弃用警告再升级到 1.0享受统一的pd.NA缺失值语义、string/boolean扩展类型与各项性能改进迁移老代码时重点排查ix、as_matrix、from_items、SparseSeries等已移除 API并将MultiIndex.labels替换为MultiIndex.codes。完整的变更清单可查阅仓库内的 v1.0.0 发布说明其中包含全部增强、API 变更、弃用、移除项、性能改进与数百条 bug 修复记录是升级与代码迁移的权威参考。【免费下载链接】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),仅供参考