axis=0纵向堆叠得series,索引拼接、值连缀;axis=1横向拼接得dataframe,索引对齐填nan,无法返回series。

concat两个Series时axis=0和axis=1的区别
默认情况下pandas.concat把Series当列处理,但Series本身是一维结构,axis=0是纵向堆叠(按索引对齐后追加),axis=1才是横向拼接成DataFrame——这不是“合并两个Series”,而是把它们变成两列的表。
-
axis=0:结果仍是Series,索引会拼接(可能重复),值直接连起来;适合合并同类指标不同批次的数据 -
axis=1:结果是DataFrame,原Series变成两列,索引自动对齐;若索引不一致,缺失位置填NaN - 别指望
axis=1返回Series——Pandas没这个设计,强行用会得到单列DataFrame,不是你想要的“合并”
索引不一致导致拼接后出现大量NaN
用axis=1拼两个长度相同但索引不同的Series,比如一个是pd.Series([1,2], index=['a','b']),另一个是pd.Series([3,4], index=['x','y']),结果DataFrame里全是NaN——因为Pandas按索引对齐,没匹配上的位置就补空。
- 解决办法一:拼之前统一索引,比如都设成
range(len(s)) - 解决办法二:用
ignore_index=True(仅对axis=0有效),丢掉原索引重排 - 解决办法三:明确要对齐逻辑,用
join='inner'或join='outer'控制对齐方式,默认是'outer'
想拼成一个Series但值顺序乱了
直接pd.concat([s1, s2], axis=0)看似简单,但若s1和s2索引有重叠(比如都是[0,1]),结果里索引会重复,后续取值、计算容易出错。
- 检查索引是否唯一:
s1.index.equals(s2.index)或s1.index.is_unique - 安全做法:加
ignore_index=True,生成连续整数索引 - 如果需要保留原始顺序但不要重复索引,用
pd.concat([s1, s2], axis=0, ignore_index=True)最省心 - 注意:
ignore_index=True会丢失索引语义,比如时间序列的日期信息就没了
concat比+或append快还是慢?
Series.append()在Pandas 2.0已弃用,官方只推concat;而+是元素级加法,不是拼接——它要求索引完全一致,且做的是数值相加,不是连接。
-
+:索引对齐后逐元素相加,s1 + s2≠ 拼接 -
append():旧版可用,但内部也是调concat,多一层封装,无优势 -
concat:底层优化过,批量拼多个Series时明显更快,尤其配合ignore_index=True - 小数据量差别不大,但写脚本时别用
append,避免升级报错
concat的默认行为,不是bug,但恰恰是多数人踩坑的起点——它不声不响就按索引配对,而不是按位置。想绕过,就得主动干预ignore_index或join参数。










