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的列?
解答
整数与浮点数场景的差异原因
核心在于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/空列时的类型推断逻辑将在未来版本改变。
- 整数列中出现
None列的数据类型推断逻辑
确实如此。拼接时Pandas会优先从非全NA的列推断最终类型:- 整数场景:df1的B列是
int64,df2的B列是含None的Int64,拼接后统一为Int64,类型推断清晰无歧义。 - 浮点数场景:df1的B列是
float64,df2的B列是全NA的object,Pandas需要将后者转为float64以兼容非NA的浮点数,但这个过程触发了关于全NA列类型推断的弃用警告。
- 整数场景:df1的B列是
未来版本含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
相关产品推荐
相关产品推荐

