如何避免Pandas横向拼接时int64被无意转换为float64?
解决pandas拼接shift后列类型转为float64的问题
这是个很常见的pandas类型转换问题,根源确实像你发现的那样——shift(-1)会在最后一行生成NaN值,而原生的int64类型无法容纳缺失值,所以pandas会自动把列的 dtype 提升为float64(因为float类型支持NaN)。这里有几种方法可以避免这种转换:
方法1:使用pandas的可空整数类型(推荐)
pandas提供了Int64(注意大写I)这种支持缺失值的整数类型,你可以先把原列转成该类型,再执行拼接操作:
# 先将原列转为可空整数类型 df['op'] = df['op'].astype('Int64') # 执行拼接 df = pd.concat([df, df.shift(-1).add_suffix('_next')], axis=1)
此时查看dtypes会发现两列都保持整数类型:
df.dtypes # op Int64 # op_next Int64 # dtype: object
方法2:填充缺失值后转回int64
如果你不想使用可空类型,可以给shift后的缺失值填充一个符合业务逻辑的整数(比如0、最后一行的值等),再强制转回int64:
# 处理shift后的缺失值并转类型 df_next = df.shift(-1).add_suffix('_next').fillna(0).astype('int64') # 拼接 df = pd.concat([df, df_next], axis=1)
⚠️ 注意:填充的值需要根据你的业务场景选择,确保不会影响后续分析。
方法3:用assign直接创建列(更简洁)
你也可以用assign方法一步完成列的创建和类型保持:
df = df.assign(op_next=df['op'].shift(-1).astype('Int64'))
这种写法更紧凑,效果和方法1一致。
内容的提问来源于stack exchange,提问作者techvslife
相关产品推荐
相关产品推荐

