You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 10:02:40