合并、连接、连接和比较#

pandas 提供了多种方法来合并和比较 SeriesDataFrame

concat()#

concat() 函数沿指定的轴连接任意数量的 SeriesDataFrame 对象,同时执行可选的集合逻辑(并集或交集)来处理其他轴上的索引。与 numpy.concatenate 类似,concat() 接受一个包含同类对象(DataFrameSeries)的列表或字典,并将它们连接起来。

备注

concat() 会进行完整的数据副本创建,反复使用 concat() 可能会创建不必要的副本。在使用 DataFrame 之前,请将所有 Seriesconcat() 对象收集到一个列表中。

frames = [process_your_file(f) for f in files]
result = pd.concat(frames)

备注

当连接 DataFrame 且具有已命名的轴时,pandas 会尽可能尝试保留这些索引/列名称。如果所有输入共享一个通用名称,则此名称将分配给结果。当输入名称不完全一致时,结果将不会命名。 MultiIndex 的情况也是如此,但该逻辑是单独在每个级别上应用的。

结果轴的连接逻辑#

join 关键字指定了如何处理第一个 DataFrame 中不存在的轴值。

join='outer' 获取所有轴值的并集

join='inner' 获取轴值的交集

要使用原始 DataFrame精确索引 执行有效的“左”连接,可以重新索引结果。

忽略连接轴上的索引#

对于没有有意义索引的 DataFrame 对象,ignore_index 会忽略重叠的索引。

连接 SeriesDataFrame#

您可以连接 SeriesDataFrame 的混合体。Series 将转换为 DataFrame ,其列名为 Series 的名称。

未命名的 Series 将被连续编号。

ignore_index=True 将删除所有名称引用。

结果的 keys#

keys 参数为结果索引或列添加另一个轴级别(创建 MultiIndex ),将特定键与每个原始 DataFrame 相关联。

keys 参数可以在基于现有:class:DataFrame 创建新 Series 时覆盖列名。

您还可以将 dict 传递给 concat() ,在这种情况下,dict 的键将用于 keys 参数,除非指定了其他 keys 参数:

创建的 MultiIndex 具有由传入的键和 DataFrame 片段的索引构建的级别:

levels 参数允许指定与 keys 关联的结果级别

将行追加到 DataFrame#

如果您有一个想要作为单一行追加到 SeriesDataFrame ,则可以将该行转换为 DataFrame 并使用 concat()

merge()#

merge() 执行类似于 SQL 的关系数据库的连接操作。熟悉 SQL 但不熟悉 pandas 的用户可以参考 comparison with SQL

合并类型#

merge() 实现常见的 SQL 风格的连接操作。

  • 一对一:连接两个 DataFrame 对象,基于它们必须包含唯一值的索引。

  • 多对一:将唯一索引连接到一个或多个不同 DataFrame 中的列。

  • 多对多:基于列进行连接。

备注

当基于列进行连接(可能是多对多连接)时,传入的 DataFrame 对象上的任何索引**都将被忽略**。

对于**多对多**连接,如果一个键组合在两个表中都出现多次,则 DataFrame 将具有相关数据的**笛卡尔积**。

merge()how 参数指定了哪些键包含在结果表中。如果一个键组合**未出现在**左表或右表中,则连接表中的值将为 NA。以下是 how 选项及其 SQL 等效名称的摘要:

合并方法

SQL 连接名称

描述

left

LEFT OUTER JOIN

仅使用左框架的键

right

RIGHT OUTER JOIN

仅使用右框架的键

outer

FULL OUTER JOIN

使用两个框架键的并集

inner

INNER JOIN

使用两个框架键的交集

cross

CROSS JOIN

创建两个框架行(rows)的笛卡尔积

You can Series and a DataFrame with a MultiIndex if the names of the MultiIndex correspond to the columns from the DataFrame. Transform the Series to a DataFrame using Series.reset_index() before merging

DataFrame 中具有重复连接键的执行外连接

警告

在重复键上进行合并会显著增加结果的维度,并可能导致内存溢出。

合并键唯一性#

validate 参数检查合并键的唯一性。将在合并操作之前检查键的唯一性,以防止内存溢出和意外的键重复。

如果用户知道右侧 DataFrame 中存在重复项,但想确保左侧 DataFrame 中没有重复项,则可以改用 validate='one_to_many' 参数,这样不会引发异常。

合并结果指示符#

merge() 接受 indicator 参数。如果为 True,则会在输出对象中添加一个名为 _merge 的 Categorical 类型列,该列可能取以下值:

观测来源

_merge

合并键仅存在于 'left' 帧中

left_only

合并键仅存在于 'right' 帧中

right_only

合并键同时存在于两个帧中

both

传递给 indicator 的字符串参数将使用该字符串作为指示符列的名称。

重叠值列#

合并的 suffixes 参数接受一个包含字符串的元组或列表,用于追加到输入 DataFrame 中重叠的列名,以区分结果列:

DataFrame.join()#

DataFrame.join() 将多个、可能拥有不同索引的 DataFrame 的列组合成一个单一的结果 DataFrame

DataFrame.join() 接受一个可选的 on 参数,该参数可以是单个列名或多个列名,用于对传入的 DataFrame 进行对齐。

要基于多个键进行连接,传入的 DataFrame 必须具有 MultiIndex

DataFrame.join 的默认行为是执行左连接,该连接仅使用调用 DataFrame 中找到的键。可以使用 how 指定其他连接类型。

连接单个索引到一个多重索引#

您可以将一个 DataFrame 和一个 Index 连接到一个 DataFrame 和一个 MultiIndex 的级别上。Indexname 将匹配 MultiIndex 的级别名称。

与两个 MultiIndex 进行连接#

传入参数的 MultiIndex 必须在连接中被完全使用,并且是左侧参数中索引的子集。

基于列和索引级别的组合进行合并#

作为 onleft_onright_on 参数传递的字符串可以引用列名或索引级别名称。这使得在不重置索引的情况下,可以将 DataFrame 实例合并到索引级别和列的组合上。

备注

DataFrame 连接到同时匹配两个参数中的索引级别的字符串时,该索引级别将作为索引级别保留在生成的 DataFrame 中。

备注

DataFrame 仅使用 MultiIndex 的部分级别进行连接时,多余的级别将被从生成的连接中删除。要保留这些级别,请在连接之前使用 DataFrame.reset_index() 对这些级别名称进行操作,将这些级别移至列。

连接多个 DataFrame#

也可以将 DataFrame 的列表或元组传递给 join() ,将它们连接在它们的索引上。

DataFrame.combine_first()#

DataFrame.combine_first() 用另一个 DataFrame 中的非缺失值更新一个 DataFrame 中对应位置的缺失值。

merge_ordered()#

merge_ordered() 将已排序的数据(例如数字或时间序列数据)与可选的缺失数据填充(使用 fill_method)结合起来。

merge_asof()#

merge_asof() 类似于有序左连接,不同之处在于匹配是基于最近的键而不是相等的键。对于 left DataFrame 中的每一行,都会选择 right DataFrameon 键小于左键的最后一行。两个 DataFrame 都必须按键排序。

可选地,merge_asof() 可以通过匹配 by 键并加上 on 键的最近匹配来执行分组合并。

merge_asof() 在报价时间和交易时间之间 2ms 内进行。

merge_asof() 在报价时间和交易时间之间 10ms 内进行,但排除时间上的精确匹配。请注意,尽管我们排除了精确匹配(报价),但之前的报价**确实**会传播到当时的时间点。

compare()#

Series.compare()DataFrame.compare() 方法允许您分别比较两个 DataFrameSeries ,并汇总它们的差异。

默认情况下,如果两个对应值相等,则显示为 NaN。此外,如果一行/列中的所有值都不同,则该行/列将从结果中省略。其余的差异将按列对齐。

将差异堆叠在行上。

使用 keep_shape=True 保留所有原始行和列

保留所有原始值,即使它们是相等的。