合并、连接、连接和比较#
pandas 提供了多种方法来合并和比较 Series 或 DataFrame 。
DataFrame.join()沿列合并多个DataFrame对象DataFrame.combine_first()使用同一位置的非缺失值更新缺失值merge_ordered()沿有序轴合并两个Series或DataFrame对象merge_asof()通过近似而不是精确匹配键来合并两个Series或DataFrame对象Series.compare()和DataFrame.compare()显示两个Series或DataFrame对象之间的值差异
concat()#
concat() 函数沿指定的轴连接任意数量的 Series 或 DataFrame 对象,同时执行可选的集合逻辑(并集或交集)来处理其他轴上的索引。与 numpy.concatenate 类似,concat() 接受一个包含同类对象(DataFrame 或 Series)的列表或字典,并将它们连接起来。
备注
concat() 会进行完整的数据副本创建,反复使用 concat() 可能会创建不必要的副本。在使用 DataFrame 之前,请将所有 Series 或 concat() 对象收集到一个列表中。
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 会忽略重叠的索引。
连接 Series 和 DataFrame#
您可以连接 Series 和 DataFrame 的混合体。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#
如果您有一个想要作为单一行追加到 Series 的 DataFrame ,则可以将该行转换为 DataFrame 并使用 concat()
merge()#
merge() 执行类似于 SQL 的关系数据库的连接操作。熟悉 SQL 但不熟悉 pandas 的用户可以参考 comparison with SQL 。
合并类型#
merge() 实现常见的 SQL 风格的连接操作。
备注
当基于列进行连接(可能是多对多连接)时,传入的 DataFrame 对象上的任何索引**都将被忽略**。
对于**多对多**连接,如果一个键组合在两个表中都出现多次,则 DataFrame 将具有相关数据的**笛卡尔积**。
merge() 的 how 参数指定了哪些键包含在结果表中。如果一个键组合**未出现在**左表或右表中,则连接表中的值将为 NA。以下是 how 选项及其 SQL 等效名称的摘要:
合并方法 |
SQL 连接名称 |
描述 |
|---|---|---|
|
|
仅使用左框架的键 |
|
|
仅使用右框架的键 |
|
|
使用两个框架键的并集 |
|
|
使用两个框架键的交集 |
|
|
创建两个框架行(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 的级别上。Index 的 name 将匹配 MultiIndex 的级别名称。
与两个 MultiIndex 进行连接#
传入参数的 MultiIndex 必须在连接中被完全使用,并且是左侧参数中索引的子集。
基于列和索引级别的组合进行合并#
作为 on、left_on 和 right_on 参数传递的字符串可以引用列名或索引级别名称。这使得在不重置索引的情况下,可以将 DataFrame 实例合并到索引级别和列的组合上。
备注
当 DataFrame 仅使用 MultiIndex 的部分级别进行连接时,多余的级别将被从生成的连接中删除。要保留这些级别,请在连接之前使用 DataFrame.reset_index() 对这些级别名称进行操作,将这些级别移至列。
连接多个 DataFrame#
DataFrame.combine_first()#
DataFrame.combine_first() 用另一个 DataFrame 中的非缺失值更新一个 DataFrame 中对应位置的缺失值。
merge_ordered()#
merge_ordered() 将已排序的数据(例如数字或时间序列数据)与可选的缺失数据填充(使用 fill_method)结合起来。
merge_asof()#
merge_asof() 类似于有序左连接,不同之处在于匹配是基于最近的键而不是相等的键。对于 left DataFrame 中的每一行,都会选择 right DataFrame 中 on 键小于左键的最后一行。两个 DataFrame 都必须按键排序。
可选地,merge_asof() 可以通过匹配 by 键并加上 on 键的最近匹配来执行分组合并。
merge_asof() 在报价时间和交易时间之间 2ms 内进行。
merge_asof() 在报价时间和交易时间之间 10ms 内进行,但排除时间上的精确匹配。请注意,尽管我们排除了精确匹配(报价),但之前的报价**确实**会传播到当时的时间点。
compare()#
Series.compare() 和 DataFrame.compare() 方法允许您分别比较两个 DataFrame 或 Series ,并汇总它们的差异。
默认情况下,如果两个对应值相等,则显示为 NaN。此外,如果一行/列中的所有值都不同,则该行/列将从结果中省略。其余的差异将按列对齐。
将差异堆叠在行上。
使用 keep_shape=True 保留所有原始行和列
保留所有原始值,即使它们是相等的。