如何用列分组均值替换DataFrame中字符串值并转换数据类型
解决含特殊字符串的大型数值型数据集类型转换与分组均值填充问题
问题背景
- 数据集为400列、30000行的大型数据,本该全为数值型,但150列因存在特殊字符串
#?(非空白值),数据类型变为object - 需求:将所有列转为float/int类型,并用
col1分组后的列均值填充常规NaN,目标执行代码:df.groupby("col1").transform(lambda x: x.fillna(x.mean())),但含#?的列会被自动剔除,无法正常执行 - 之前尝试的方案均存在痛点:
- 把
#?替换为数值再转float:替换值会被纳入均值计算,不符合需求 - 替换为特殊标记值(如-123.456):不知道如何在计算均值时排除该值
- 直接将
#?转为NaN:列数据类型会变回object,仍无法执行分组填充代码
- 把
可行解决方案
用以下代码即可一次性解决类型转换与特殊值处理问题,之后就能正常执行分组均值填充:
df = df.replace('#?', '').astype(float, errors='ignore')
代码说明
replace('#?', ''):将特殊字符串#?替换为空字符串,astype(float)会自动将空字符串识别为NaNastype(float, errors='ignore'):将列转为float类型,errors='ignore'确保原本已是数值型的列不受影响,仅处理object类型列- 转换完成后,所有列均为float数值型,
#?被转为NaN,此时执行df.groupby("col1").transform(lambda x: x.fillna(x.mean())),就能用分组均值正常填充所有NaN(包括原常规NaN和由#?转换而来的NaN)
内容的提问来源于stack exchange,提问作者prof35
相关产品推荐
相关产品推荐

