Pandas 2.2.3+中分类列值替换后类型转换的简洁方法咨询
解决Pandas 2.2.3+中分类列转数值的FutureWarning问题
问题场景
原代码用于将DataFrame的分类列值替换为数值,但在Pandas 2.2.3+版本中会抛出FutureWarning:
原代码:
import pandas as pd df = pd.DataFrame(pd.Categorical(['a','b','b'],['a','b']), columns=['x']) df.loc[:,'x'] = df['x'].replace({'a':1, 'b':2})
警告信息:
/tmp/ipykernel_1721527/1018712932.py:4: FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future error of pandas. Value '[1, 2, 2]
Categories (2, object): [1, 2]' has dtype incompatible with category, please explicitly cast to a compatible dtype first.
df.loc[:,'x'] = df['x'].replace({'a':1, 'b':2})
用户原有的冗长解决方案:
ncol = df['x'].replace({'a':1, 'b':2}).astype('float') df['x'] = None df = df.astype({'x':'float'}) df.loc[:,'x'] = ncol
简洁实现方式
以下几种方法可以更高效地完成转换,同时消除警告:
直接替换后转换 dtype 赋值
一步完成替换、类型转换和列赋值,Pandas会自动调整列的 dtype:df['x'] = df['x'].replace({'a':1, 'b':2}).astype('float')如果需要整数类型,将
'float'改为'int'即可。利用分类列的
cat.codes属性(适用于分类与数值有顺序对应场景)
若分类顺序['a','b']正好对应目标数值1、2,可直接通过分类编码加1实现,效率更高:df['x'] = df['x'].cat.codes + 1
内容的提问来源于stack exchange,提问作者velochy
相关产品推荐
相关产品推荐

