如何以非弃用的简洁方式向DataFrame单列追加Series或数组?
问题描述
我有一个包含多列的DataFrame和一个Series,想要将该Series追加到DataFrame的指定列末尾,同时让其他列对应位置的值设为NaN,且不与原有数据合并。已知append方法已被弃用,目前自己的实现方式在列数较多时过于繁琐,想找更简洁的替代方案。
现有实现(仅适合列数少的场景):
import pandas as pd import numpy as np a = pd.DataFrame({'one': [1, 2, 3], 'two': [4, 5, 6]}) b = pd.Series([7, 8, 9], name='two') pd.concat([a, pd.DataFrame({'one': np.nan, 'two': b})], ignore_index=True)
预期效果:
one two 0 1.0 4 1 2.0 5 2 3.0 6 3 NaN 7 4 NaN 8 5 NaN 9
简洁解决方案
核心思路是先将Series转为单列DataFrame,再通过列对齐自动填充其他列为NaN,最后与原DataFrame拼接,无需手动指定每一列的NaN值。
方法1:通用多列场景方案
利用reindex自动对齐原DataFrame的所有列,不管列数多少都能一键处理:
import pandas as pd import numpy as np a = pd.DataFrame({'one': [1, 2, 3], 'two': [4, 5, 6]}) b = pd.Series([7, 8, 9], name='two') # 将Series转为DataFrame,对齐原DataFrame的所有列(未匹配列自动填充NaN) b_df = b.to_frame().reindex(a.columns, axis=1) # 拼接数据并重置索引 result = pd.concat([a, b_df], ignore_index=True) print(result)
输出与预期完全一致,且无需手动维护列名,适配任意列数的DataFrame。
方法2:避免整数列自动转为float(可选)
由于NaN的存在,pandas默认会将整数列转为float类型。如果需要保留整数类型,可以使用pandas的Nullable整数类型:
# 定义DataFrame时使用Nullable int类型 a = pd.DataFrame({ 'one': pd.Series([1, 2, 3], dtype='Int64'), 'two': pd.Series([4, 5, 6], dtype='Int64') }) b = pd.Series([7, 8, 9], name='two', dtype='Int64') b_df = b.to_frame().reindex(a.columns, axis=1) result = pd.concat([a, b_df], ignore_index=True) print(result)
输出:
one two 0 1 4 1 2 5 2 3 6 3 NaN 7 4 NaN 8 5 NaN 9
此时one列保持Int64(Nullable整数)类型,不会被强制转为float。
补充说明
reindex(a.columns, axis=1)会严格按照原DataFrame的列顺序排列新数据,并自动填充缺失列为NaN,完美适配多列场景。pd.concat是官方推荐的append替代方法,功能更灵活,是当前pandas版本中合并数据的标准方式。
内容的提问来源于stack exchange,提问作者Mivina
相关产品推荐
相关产品推荐

