如何使用pd.merge基于公共user列合并3个及以上DataFrame
报错原因
pd.merge() 单次仅支持合并2个DataFrame,传入3个及以上DataFrame时,第三个及之后的位置参数会被误识别为合并规则配置项(比如连接方式、后缀配置等),pandas内部尝试判断传入的DataFrame作为布尔值的有效性时,就会抛出你看到的真值判断歧义报错。
解决方法
方法1:链式调用merge(适合少量DataFrame场景)
每次调用merge合并两个结果,连续调用即可完成多表合并,和你之前双表合并的逻辑完全一致:
import pandas as pd result = pd.merge( df1[['user', 'books']], df2[['user', 'animal']], on='user' ).merge( df3[['user', 'place']], on='user' )
运行输出结果:
user books animal place 0 alex 2 0 3 1 andrew 10 0 4 2 kelvin 15 2 5 3 mary 5 1 3
方法2:reduce批量合并(适合大量DataFrame场景)
如果需要合并的表数量较多,链式调用写起来冗余,可以借助functools.reduce自动迭代完成所有表的合并,不需要重复写merge语句:
import pandas as pd from functools import reduce # 将所有需要合并的DataFrame存入列表 df_to_merge = [ df1[['user', 'books']], df2[['user', 'animal']], df3[['user', 'place']] ] # 自动依次取列表内两个表做合并,再将结果和下一个表继续合并 result = reduce(lambda left_df, right_df: pd.merge(left_df, right_df, on='user'), df_to_merge)
如果需要调整连接逻辑,只需要在pd.merge()中增加how参数即可:how='left'为左连接、how='outer'为全外连接,默认how='inner'取所有表共有的user值,和你双表合并的默认逻辑一致。
内容的提问来源于stack exchange,提问作者nerd
相关产品推荐
相关产品推荐

