为什么在 Python 中使用 Pandas?

Pandas 通常以其标志性的黑白熊标志为标志,是 Python 数据分析生态系统中最受欢迎的库之一。自诞生以来,它从根本上改变了 Python 中数据操作和分析的格局。但为什么它获得了如此巨大的人气呢?从本质上讲,Pandas 提供了灵活高效的结构来组织和操作大型数据集,弥合了 Python 和广阔的数据世界之间的差距。

Pandas简史
Pandas的故事要从它的创造者韦斯-麦金尼(Wes McKinney)说起。这段旅程始于 2008 年,当时麦金尼在一家量化金融公司 AQR Capital Management 工作。他面临着使用现有工具进行数据分析和操作的挑战,尤其是在性能和生产率方面。

当时,Python 已经是各个领域的流行语言,但并不是数据分析和统计的实际选择。虽然有一些用于数值计算的库,如 NumPy,但它们无法提供金融分析中经常遇到的结构化数据操作所需的简便性和灵活性。

认识到这一差距后,McKinney 开始开发一套数据结构,以方便在 Python 中进行高效的数据操作和分析。经过努力,Pandas 的第一个版本于 2009 年开源。Pandas "这个名字来源于 "panel data "一词,这是计量经济学中的一个常用术语,用于描述涉及多个时间段观测值的数据集。

随着时间的推移,Pandas 凭借其易用性、灵活性和强大的功能开始获得越来越多的关注。它成为 Python 数据堆栈的关键,与 NumPy、Matplotlib 和 SciPy 等其他库相辅相成。社区在其成长过程中发挥了关键作用,众多贡献者增强了它的功能,优化了它的性能,并围绕它创建了一个庞大的生态系统。

如今,Pandas 已成为用于数据分析和处理的最广泛 Python 库之一,并拥有一个充满活力的社区和不断增长的功能。它的影响力已经超越了金融领域,进入了从学术界、医疗保健到媒体和电子商务等广泛领域,在开源软件史上占据了一席之地。

核心数据结构:Series 和 DataFrame
Pandas 最引人注目的功能之一是其强大而直观的数据结构,其中最突出的两个是Series和DataFrame。这些结构是 Pandas 的核心,为 Pandas 的大部分操作奠定了基础。

  1. 系列:
    • 定义:ASeries是一个一维标记数组,可以保存任何数据类型,包括整数、浮点数、字符串等。将其视为 Python 中列表和字典的结合体,其中每个项目都有一个与其关联的标签或索引。
    • 特征: Series一个关键特征是它是同质的,这意味着其中的所有元素都具有相同的数据类型。它具有索引(标签)和值,可以分别使用.index和.values属性来访问它们。
    • 创建Series:您可以从列表、字典或 NumPy 数组创建。例如,pd.Series([1, 2, 3, 4])创建一个简单的整数系列。
  • 数据框:
    • 定义:ADataFrame是一种二维标记数据结构,类似于数据库中的表格、Excel 电子表格或 R 中的数据框。它可以可视化为共享公共索引的Series对象的集合。
    • 特点:与 不同Series,aDataFrame可以容纳不同数据类型的多个列。它具有行索引和列标签,并且其大小是可变的 - 您可以在创建后更改行数和列数。
    • 创建:DataFrame 可以从各种来源创建,例如字典、列表、Series,甚至其他 DataFrame。例如,pd.DataFrame({'A': [1, 2], 'B': [3, 4]})创建一个简单的 DataFrame,其中包含标记为“A”和“B”的两列。

    交互和属性Series:对象DataFrame都配备了一组丰富的方法和属性,可以轻松进行数据探索、操作和转换。例如,.head()、.describe()、 和 等方法.loc[]提供快速见解和数据访问,从而提高生产力和效率。

    Series和结构DataFrame是 Pandas 库的支柱。通过了解 Pandas 的复杂性和功能,人们可以利用 Pandas 的真正力量进行数据操作和分析。

    数据清理和转换工具
    在数据科学领域,数据很少以原始、即用的格式出现。通常,现实世界的数据集包含缺失值、不一致或其他缺陷,需要在分析之前进行纠正。Pandas 在这方面表现出色,提供了大量专为数据清理和转换而定制的工具,确保数据集处于分析的理想状态。

    1. 处理缺失数据:
      • 检测  :类似.isnull()和方法.notnull()允许用户快速识别数据集中缺失或 NA 值。
      • 替换:.fillna()方法提供了替换缺失值的灵活性,可以使用常量、计算值(如平均值或中位数),甚至可以基于其他条目向前或向后填充。
      • Dropping:使用.dropna(),用户可以有效地丢弃包含缺失值的行或列。
  • 数据转换:
    • 映射:.map()和.applymap()函数允许按元素进行操作,从而实现基于自定义逻辑或函数的数据转换。
    • 聚合:使用诸如.groupby() 之类的方法,您可以按特定条件对数据进行分组,然后应用聚合函数,例如求和、平均值或自定义函数。
    • 透视:.pivot_table()功能允许重塑数据并执行分组聚合,对于创建汇总视图特别有用。
  • 字符串操作:
    • 字符串方法:通过.str访问器,可以使用许多字符串方法,从而促进对字符串列的拆分、剥离、替换等操作。
    • 正则表达式:Pandas 集成了 Python 的内置re模块,可以使用正则表达式进行强大的字符串匹配和提取。
  • 重复数据:
    • 检测:.duplicated()方法有助于识别重复行。
    • 删除:.drop_duplicates()允许用户根据特定条件删除重复行,确保数据完整性。
  • 类型转换:
    • 更改数据类型:使用.astype(),可以转换列的数据类型以满足特定需求,例如将字符串转换为类别或将浮点数转换为整数。
    • 分类数据:Pandas 支持分类数据类型,使用 .cat 等方法帮助高效存储和处理分类条目。
  • 标准化和缩放:
    • Pandas 与 Scikit-learn 等库无缝集成,实现数据标准化和扩展,这对于许多机器学习算法至关重要。
  • 异常值检测和处理:
    • 使用各种统计方法和布尔索引,可以识别和处理异常值,确保分析的稳健性。

    通过利用这些清理和转换工具,数据科学家和分析师可以节省宝贵的时间,并避开通常繁琐的数据预处理过程,更多地专注于从数据中提取有意义的见解。

    优雅地处理丢失的数据
    缺失数据是数据分析领域普遍存在的挑战。无论是由于数据收集问题、传输错误还是其他因素,数据集中的差距都会影响分析并导致不准确的结论。值得庆幸的是,Pandas 提供了一套丰富的工具来解决和管理这些差距,从而可以优雅地处理丢失的数据。

    1. 检测缺失数据:
      • 识别空值:类似.isnull()和 的方法.notnull()有助于查明数据集中缺失值或 NA 值的位置。
      • 计数 Null:在 DataFrame 上使用.isnull().sum()可提供按列计数缺失值。
  • 填充缺失数据:
    • 常量填充:.fillna(value)函数允许您用指定的常量替换所有缺失值。
    • 向前和向后填充:使用方法.fillna(method='ffill')和.fillna(method='bfill'),您可以分别根据先前或后续数据点填充缺失值。
    • 插值:.interpolate()方法提供了基于线性插值或其他技术填充缺失值的选项。
  • 删除丢失的数据:
    • 丢弃行或列:.dropna()方法是通用的,允许删除至少包含一个缺失值的任何行或列。
    • 基于阈值的删除:通过指定阈值,可以删除超过一定数量缺失值的行或列。
  • 替换丢失的数据:
    • 用统计度量替换:通常,用均值、中位数或众数等集中趋势替换缺失值是一种可行的策略。例如,.fillna(df['column'].mean())用平均值替换列中的缺失值。
    • 自定义替换逻辑:将.apply()或.applymap()函数与自定义逻辑一起使用可以实现更复杂的替换。
  • 缺失数据的特殊数据类型:
    • Pandas 中的 NA 类型:在较新版本的 Pandas 中,pd.NA值提供了所有数据类型中缺失数据的更一致的表示。
    • 可空数据类型:这些新数据类型,例如“Int64”(而不是“int64”),为整数和布尔列中的缺失值提供更好的支持。
  • 评估缺失数据的影响:
    • 重要的是不仅要处理丢失的数据,还要了解其对分析的潜在影响。可视化、相关性研究和敏感性分析等技术可以帮助评估缺失数据对结果的影响程度。

    妥善处理丢失的数据可确保后续数据分析既准确又有意义。有了 Pandas,用户就拥有了一个全面的工具包,可以有效地解决数据差距带来的挑战。

    合并、连接和连接 DataFrame
    在现实场景中,数据通常驻留在多个源或表中。将它们结合起来是数据操作的一个组成部分,可以实现整体视图并促进更深入的分析。Pandas 提供了一组为此目的量身定制的强大功能,确保不同数据集的无缝、高效集成。

    1. 连接:
      • 定义:串联是垂直或水平堆叠数据集的过程。
      • 功能:使用 pd.concat() 将两个或多个 Pandas 对象沿特定轴连接起来。
      • 键和多索引:通过使用keys参数,可以引入额外的层次结构,这对于跟踪每个段的原始来源很有用。
  • 数据库式合并:
    • 定义:通过使用一个或多个键连接行来合并数据集。
    • 函数:pd.merge()函数是合并的主要工具。通过指定how参数,可以确定要执行的合并类型:“left”, “right”, “inner”, 或“outer”.
    • 在多个键上:通过向 on 参数传递列名列表,可以在多列上进行合并。
  • Joining:
    • 定义:Joining 是一种方便的方法,可将两个索引可能不同的 DataFrame 中的列合并到一个结果 DataFrame 中。
    • 功能:DataFrames 上的 .join() 方法可以实现这一点,默认情况下,它会在索引上进行连接。
    • 连接类型:与合并类似,您可以指定连接类型:“left”, “right”, “inner”, 或“outer”.”。
  • 处理重叠的列:
    • 后缀:在合并或连接具有重叠列名的 DataFrames 时,后缀参数允许您指定后缀,以附加到重叠列名。
    • 指定要加入的列:通过 left_on 和 right_on 参数,可以定义如果合并的数据帧中列名不同,应在哪些列上进行连接。
  • 合并索引:
    • 使用索引:在某些情况下,用于合并的键可能在 DataFrame 的索引中找到。在这种情况下,可以使用 left_index=True 或 right_index=True 参数来合并索引值。
  • 性能方面:
    • 指标参数:通过设置 indicator=True,输出 DataFrame 中会添加名为 _merge 的特殊列,帮助识别每一行的来源。
    • 验证合并:validate 验证参数可用于确保特定的合并保证,如一对一、一对多或多对多合并。

    合并、连接和串联是数据操作的基本操作。掌握 Pandas 中的这些功能可确保轻松、正确地集成多个来源的数据,为后续分析和见解提取奠定坚实的基础。

    时间序列分析能力
    时间序列数据具有连续性,带来了独特的挑战和机遇。这种按时间顺序排列的数据形式在金融、经济、环境研究等领域经常遇到。Pandas 以其以时间为中心的工具,促进了强大而高效的时间序列分析,使其成为许多分析师的首选。

    1. 日期时间索引:
      • 创建:使用pd.to_datetime(),可以将一系列字符串转换为日期时间序列。
      • 日期时间属性:一旦按日期时间索引,DataFrame 和 Series 就可以通过访问器轻松提取年、月、日等元素.dt。
  • 日期范围生成:
    • 功能:pd.date_range()允许创建固定频率的DatetimeIndex,这有利于从头开始构建基于时间的系列或填补现有系列中的空白。
  • 重新采样:
    • 上采样和下采样:使用.resample(),可以更改数据的频率,将数据聚合到较低频率(下采样)或插值到较高频率(上采样)。
    • 方法:常见的重采样方法包括总和、平均值、最大值、最小值等。
  • 时区处理:
    • 本地化:使用 将原始时间序列转换为本地时区.tz_localize()。
    • 转换:本地化后,您可以使用 转换为其他时区.tz_convert()。
  • 时间偏移:
    • 日期偏移:Day、Hour、Minute、 等对象允许灵活的日期算术。
    • 平移:.shift()方法可以实现滞后或领先的数据点,这对于计算周期变化特别有用。
  • 滚动和扩展:
    • 滚动窗口:.rolling()方法有助于移动窗口的计算,例如滚动平均值。
    • 扩展窗口:使用.expanding(),可以在扩展窗口上进行计算,从系列开始处累积值。
  • 时间增量计算:
    • 持续时间:使用 Pandas Timedelta 计算日期之间的差异,捕获各种单位(如天、小时、分钟等)的持续时间。
    • 操作:对 timedelta 对象执行算术运算、比较和聚合。
  • 期间和期间索引:
    • 固定频率:周期代表固定频率间隔(例如 2021 年 1 月或 2020 年第三季度),对于基于周期的时间序列数据非常有用。
    • 转换:在日期时间对象和周期对象表示的时间序列之间进行转换。
  • 滞后、领先和差异:
    • Shift:轻松滞后或超前时间序列中的数据点。
    • 差异:使用 .diff() 计算连续数据点之间的差值。
  • 假期和日历:
    • 工作日:Pandas 可以识别工作日并在时间序列计算中排除周末和公共假期。
    • 自定义日历:扩展或定义自定义业务日历,根据特定用例定制日期逻辑。

    结合这些时间序列分析功能,Pandas 可确保对时态数据及其所有细微差别和模式进行彻底、有效的分析。无论是财务预测、环境趋势分析还是任何有时限的研究,Pandas 都提供了获得富有洞察力和准确结果所需的工具。

    与其他库的兼容性
    Pandas 虽然本身很强大,但当被视为更大的 Python 生态系统的一部分时,它就更加强大。它与无数其他库的无缝互操作性增强了它的实用性。这种兼容性不仅简化了工作流程,还允许用户利用专用工具来执行各种任务,而无需进行繁琐的数据格式转换。

    1. NumPy:
      • 基础兼容性:Pandas 构建在 NumPy 之上。Pandas 的基本数据结构(例如 Series 和 DataFrame)本质上是具有增强功能的数组。
      • 数组操作:NumPy 的数组操作可以直接应用于 Pandas 数据结构。
  • Matplotlib 和 Seaborn:
    • 可视化:通过简单的调用,您可以使用 Matplotlib 或 Seaborn 绘制 Pandas 数据结构,将数据转化为富有洞察力的可视化效果。
    • 集成绘图:Pandas 甚至具有由 Matplotlib 提供支持的内置基本绘图方法。
  • Scikit 学习:
    • 机器学习:轻松地将 Pandas 数据结构中的数据输入 Scikit-learn 的机器学习模型、预处理工具和评估指标中。
    • 数据预处理:标签编码、标准化和训练测试分割等工具可以直接与 Pandas DataFrames 连接。
  • Statsmodels:
    • 统计分析:对于那些寻求比 Pandas 中提供的更详细统计分析的人,Statsmodels 无缝集成,允许回归分析、时间序列预测等。
  • SQL 数据库:
    • 数据库连接:使用 SQLAlchemy 等库,您可以将 Pandas 环境与各种 SQL 数据库连接,从而促进直接将数据提取到 DataFrame 中或将结果写回数据库。
  • SciPy:
    • 科学计算:利用 SciPy 模块直接在 Pandas 数据结构上进行优化、集成和特殊功能,扩展您的数据分析能力。
  • TensorFlow 和 PyTorch:
    • 深度学习:从 Pandas 中的数据整理过渡到在 TensorFlow 或 PyTorch 中构建深度学习模型非常简单,这些库通常支持直接输入 Pandas 结构或轻松转换为兼容格式。
  • Geopandas:
    • 地理空间分析:对于地理空间数据操作,Geopandas 通过空间功能增强了 Pandas DataFrames,允许进行空间连接、绘图和地理空间计算等操作。
  • Dask:
    • 扩展和并行性:对于大规模数据,Dask 提供了一个模仿 Pandas 的并行计算框架,可以对不适合内存的数据集进行操作。
  • PyArrow 和 Parquet:
    • 数据存储和传输:Pandas 可以通过 PyArrow 等库与 Parquet 等现代数据存储和序列化格式对接,确保高效存储以及与大数据工具的互操作性。

    Pandas 凭借其兼容性,充当了 Python 数据生态系统的中心枢纽。它弥合了数据操作和其他专业任务之间的差距,确保流畅且集成的数据分析体验。