
在数据分析和处理过程中,我们经常需要将来自不同来源的数据进行整合。一个常见的需求是,当两个dataframe拥有共同的标识键时,我们希望合并它们的数据,使得:
这种合并方式旨在创建一个全面的数据集,其中包含两个原始DataFrame的所有信息,通过共享键进行对齐,并用 NaN 值填充缺失的数据。
考虑以下两个示例DataFrame dfa 和 dfb:
import pandas as pd
import numpy as np
# DataFrame A
data_a = {
'host': ['aa', 'bb', 'cc'],
'val1': [11, 22, 33],
'val2': [44, 55, 66]
}
dfa = pd.DataFrame(data_a)
# DataFrame B
data_b = {
'host': ['aa', 'bb', 'dd'],
'val1': [11, 22, 0],
'val3': [77, 88, 99]
}
dfb = pd.DataFrame(data_b)
print("DataFrame A:")
print(dfa)
print("\nDataFrame B:")
print(dfb)输出:
DataFrame A: host val1 val2 0 aa 11 44 1 bb 22 55 2 cc 33 66 DataFrame B: host val1 val3 0 aa 11 77 1 bb 22 88 2 dd 0 99
我们期望的合并结果如下,其中 ('host', 'val1') 组合是共享键:
host val1 val2 val3 0 aa 11 44.0 77.0 1 bb 22 55.0 88.0 2 cc 33 66.0 NaN 3 dd 0 NaN 99.0
可以看到,('aa', 11) 和 ('bb', 22) 的数据被合并,dfa 独有的 ('cc', 33) 和 dfb 独有的 ('dd', 0) 也被保留为新行。
pandas.DataFrame.join() 方法提供了一种灵活的方式来合并两个DataFrame。当使用 how='outer' 参数时,它会执行外连接操作,确保所有在两个DataFrame中出现的键都会被包含在最终结果中。对于只存在于一个DataFrame中的键,相应缺失的数据将用 NaN 填充。
关键步骤:
示例代码:
# 定义用于合并的键
cols_to_merge = ['host', 'val1']
# 使用 set_index 将键列设置为索引,然后执行外连接,最后重置索引
merged_df_join = dfa.set_index(cols_to_merge).join(dfb.set_index(cols_to_merge), how='outer').reset_index()
print("\n使用 DataFrame.join(how='outer') 的合并结果:")
print(merged_df_join)输出结果:
使用 DataFrame.join(how='outer') 的合并结果: host val1 val2 val3 0 aa 11 44.0 77.0 1 bb 22 55.0 88.0 2 cc 33 66.0 NaN 3 dd 0 NaN 99.0
这种方法清晰地实现了我们期望的合并逻辑,尤其适用于需要全面保留所有键值对的场景。
pandas.DataFrame.combine_first() 方法提供了一种不同的合并策略。它会优先保留调用者DataFrame(即 dfa)中的非 NaN 值。对于 dfa 中为 NaN 的位置,它会尝试使用参数DataFrame(即 dfb)中对应位置的值进行填充。如果 dfb 中对应位置也是 NaN,则最终结果仍为 NaN。此方法在处理数据填充和合并时非常有用,尤其当一个DataFrame是主数据源,另一个是补充数据源时。
关键步骤:
示例代码:
# 定义用于合并的键
cols_to_merge = ['host', 'val1']
# 使用 set_index 将键列设置为索引,然后执行 combine_first,最后重置索引
merged_df_combine_first = dfa.set_index(cols_to_merge).combine_first(dfb.set_index(cols_to_merge)).reset_index()
print("\n使用 DataFrame.combine_first() 的合并结果:")
print(merged_df_combine_first)输出结果:
使用 DataFrame.combine_first() 的合并结果: host val1 val2 val3 0 aa 11 44.0 77.0 1 bb 22 55.0 88.0 2 cc 33 66.0 NaN 3 dd 0 NaN 99.0
combine_first 在此场景下也能达到相同的效果,因为它本质上是在构建一个“完整”的DataFrame,其中 dfa 的数据优先,然后用 dfb 的数据来补充 dfa 中缺失的部分,包括 dfa 中不存在的行和列。
在处理本教程中描述的特定需求(合并共有键数据并添加独有键行)时,两种方法都能有效达成目标。选择哪种方法取决于个人偏好以及对代码语义的理解。通常,join(how='outer') 在表达“全面合并”的意图上更为直观。
# 使用 pd.merge 实现相同效果
merged_df_merge = pd.merge(dfa, dfb, on=cols_to_merge, how='outer')
print("\n使用 pd.merge(how='outer') 的合并结果:")
print(merged_df_merge)merge 的优势在于可以直接指定 on 参数进行列合并,而无需先 set_index 再 reset_index,代码通常更简洁。本教程重点介绍了 join 和 combine_first 作为替代方案,但 merge 也是一个非常强大的工具。
本教程详细介绍了在Pandas中合并两个DataFrame的两种高级方法:DataFrame.join(how='outer') 和 DataFrame.combine_first(),以满足对共有键数据进行扩展并添加独有键行的需求。通过将关键列设置为索引,这两种方法都能有效地实现数据的全面整合,生成一个包含所有原始信息且结构清晰的DataFrame。理解它们的原理和适用场景,能够帮助您在数据处理任务中做出更合适的选择,从而高效地管理和分析数据。
以上就是Pandas DataFrame 高级合并技巧:处理共有与独有键的策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号