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

Pandas 2.2.2拼接含浮点数与None的DataFrame触发FutureWarning问题

Pandas 2.2.2拼接含None的DataFrame触发FutureWarning的问题

在使用Pandas 2.2.2时,发现一个差异现象:拼接包含整数与None的DataFrame时无任何警告,但拼接包含浮点数与None的DataFrame时会触发FutureWarning。

代码示例

import pandas as pd

# 整数类型拼接:运行无警告
df1 = pd.DataFrame({'A': [1], 'B': [4]})
df2 = pd.DataFrame({'A': [2], 'B': [None]})
print(len(pd.concat([df1, df2])))

# 浮点数类型拼接:触发FutureWarning
df1 = pd.DataFrame({'A': [1], 'B': [4.0]})
df2 = pd.DataFrame({'A': [2], 'B': [None]})
print(len(pd.concat([df1, df2])))

示例输出

2
./test.py:18: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.
  print(len(pd.concat([df1, df2])))
2

疑问

  • 为何整数类型无问题,浮点数类型却触发警告?
  • None所在列的数据类型似乎是从拼接的其他DataFrame中推断而来?
  • 若整个DataFrame为空或全为None,可检查并跳过拼接,警告合理;但当部分列有有效数据时,未来该如何处理含NaN的列?

解答

  1. 整数与浮点数场景的差异原因
    核心在于Pandas对两类列处理None的逻辑不同:

    • 整数列中出现None时,Pandas会自动将列转为Int64(可空整数类型),此时df2的B列类型为Int64,和df1初始的int64列拼接时,类型能无缝兼容统一,不会触发关于全NA/空列的检查。
    • 浮数列场景中,df2的B列因只有None,初始类型是object,而df1的B列是float64。拼接时Pandas检测到df2的B列是全NA的object列,正好命中2.2.2版本新增的警告触发条件——拼接涉及全NA/空列时的类型推断逻辑将在未来版本改变。
  2. None列的数据类型推断逻辑
    确实如此。拼接时Pandas会优先从非全NA的列推断最终类型:

    • 整数场景:df1的B列是int64,df2的B列是含None的Int64,拼接后统一为Int64,类型推断清晰无歧义。
    • 浮点数场景:df1的B列是float64,df2的B列是全NA的object,Pandas需要将后者转为float64以兼容非NA的浮点数,但这个过程触发了关于全NA列类型推断的弃用警告。
  3. 未来版本含NaN列的处理方式
    未来版本中,Pandas不会再忽略全NA/空列来推断最终类型,而是会保留这些列的原始类型(比如全NA的object列),可能导致拼接后的列类型不符合预期。针对部分列有有效数据的场景,推荐提前处理:

    • 手动指定列类型:拼接前用astype()将全NA列转为目标类型,比如df2['B'] = df2['B'].astype('float64'),再执行拼接。
    • 提前过滤全NA列:如果全NA列无保留必要,拼接前用dropna(axis=1, how='all')移除这些列,避免触发警告和未来的类型问题。
    • 强制指定拼接类型:使用pd.concat()的dtype参数,明确指定拼接后的列类型,强制统一类型标准。

内容的提问来源于stack exchange,提问作者Krishna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:05:02