Pandas提取分类列数字转int:代码未达预期效果求助
问题分析与解决
你的代码无法生效的核心原因是链式索引导致赋值操作未作用到原DataFrame:data[data['c'].notna()]['c']这种写法会返回原数据的副本而非视图,赋值只会修改临时副本,原DataFrame不会被更新。
解决方法一:使用.loc定位赋值(推荐)
用pandas官方推荐的.loc索引器直接定位目标行和列,确保修改作用于原数据:
import pandas as pd import numpy as np data = pd.DataFrame( {'c':[np.nan, 'group 001', 'group 002', '03 group']} ) # 用.loc精准定位非空行的c列,直接赋值提取后的数字 data.loc[data['c'].notna(), 'c'] = data.loc[data['c'].notna(), 'c'].str.extract('(\d+)').astype(int)
解决方法二:直接处理整列
str.extract会自动保留原列的NaN值,无需单独过滤非空行,写法更简洁:
import pandas as pd import numpy as np data = pd.DataFrame( {'c':[np.nan, 'group 001', 'group 002', '03 group']} ) # 提取数字并转为支持NaN的整数类型 data['c'] = data['c'].str.extract('(\d+)').astype('Int64')
这里用Int64(大写I)是pandas的可空整数类型,既能保留整数类型,又能正确处理NaN值。
执行后,data['c']的结果就是预期的[np.nan, 1, 2, 3]。
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

