Pandas中使用concat(axis=1)执行Inner Join时为何保留animal列?
为什么Pandas中pd.concat设置axis=1且join='inner'时会保留animal列?
先把你的代码示例贴出来方便对照:
import pandas as pd df1 = pd.DataFrame([['a',1],['b',2]], columns=['letter','number']) df3 = pd.DataFrame([['c',3,'cat'],['d',4,'dog']], columns=['letter','number','animal']) # 行拼接(axis=0)的inner join结果 pd.concat([df1,df3], join='inner') # 输出: # letter number # 0 a 1 # 1 b 2 # 0 c 3 # 1 d 4 # 列拼接(axis=1)的inner join结果 pd.concat([df1,df3], join='inner', axis=1) # 输出: # letter number letter number animal # 0 a 1 c 3 cat # 1 b 2 d 4 dog
核心问题出在**join参数在不同axis下的作用对象完全不一样**,这是很多人容易踩的坑:
当
axis=0(默认的行拼接模式):join='inner'是对列名做交集筛选——只保留两个DataFrame都存在的列。df1只有letter和number,df3多出来的animal列不在交集中,所以被丢弃,这和你看到的结果一致。当
axis=1(列拼接/横向合并模式):join='inner'的作用对象变成了行索引(index)——只保留两个DataFrame索引完全匹配的行。你的两个DataFrame索引都是[0,1],所以所有行都被保留。
而列的处理是直接把两个DataFrame的所有列合并到一起,因为join参数在这里根本不管列的筛选!所以df3的animal列自然会被保留下来。
简单总结一下concat的join参数逻辑:
- axis=0 → 管列:inner取列名交集
- axis=1 → 管行:inner取行索引交集
如果你的需求是在横向合并时,既保留索引匹配的行,又只保留两个DataFrame共有的列,那需要先手动筛选列再拼接,比如:
# 先找出两个DataFrame共有的列 common_columns = df1.columns.intersection(df3.columns) # 只保留共有列再横向拼接 pd.concat([df1[common_columns], df3[common_columns]], axis=1)
这样输出就只会保留letter和number列了。
内容的提问来源于stack exchange,提问作者user5167712
相关产品推荐
相关产品推荐

