为何DataFrame可存NaN,拼接含全NaN的categorical列却触发警告?
拼接含缺失值的Categorical列触发FutureWarning的原因
核心差异:object vs Categorical
object是无约束的通用列类型,不管存None还是其他值,拼接时就是简单合并元素,不会校验任何规则。但Categorical是带预定义类别集合的约束型类型:所有非缺失值必须属于这个集合,缺失值(None/NaN)是独立状态,不算任何类别。
警告触发的具体原因
你将列转为Categorical后,两个DataFrame的B列类别集合其实并不一致:
- df1的B列存在非None的有效值,转成Categorical时,pandas会自动提取这些有效值作为
categories; - df2的B列全是None,转成Categorical时,因为没有可提取的有效值,会生成空的categories集合。
用pd.concat拼接这两列时,pandas需要统一它们的类别规则。当前版本会自动合并两个类别集合(空集合+df1的类别),但pandas官方已明确:这种隐式合并的行为在未来版本会被修改,后续必须由用户显式指定类别不一致的处理逻辑,因此抛出FutureWarning提前预警。
另外,虽然Categorical允许存储缺失值,但类别不匹配时,缺失值的处理逻辑会存在歧义,这也是警告触发的辅助原因。
验证与解决办法
- 可以通过以下代码验证类别差异:
会看到一个列的categories有有效值,另一个为空。print(df1['B'].cat.categories, df2['B'].cat.categories) - 解决方式是拼接前统一两个列的类别,比如:
统一类别后再拼接就不会触发警告。# 将df2的B列类别对齐到df1的类别 df2['B'] = df2['B'].astype('category').cat.set_categories(df1['B'].cat.categories) # 或者合并两者的类别集合 combined_cats = df1['B'].cat.categories.union(df2['B'].cat.categories) df1['B'] = df1['B'].cat.set_categories(combined_cats) df2['B'] = df2['B'].cat.set_categories(combined_cats)
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

