DataFrame数据清洗:如何将Set(float)类型列转为float/int?
DataFrame类型转换报错解决方案
报错根源
目标列(irs_pop、latitude、longitude、fips)中存在集合(set)类型数据,同时部分列混合了float值,导致直接类型转换失败。
各报错原因
float() argument must be a string or a real number, not 'set':astype无法直接将集合类型转为数值类型sequence item 0: expected str instance, float found:','.join(x)仅支持字符串元素拼接,但集合内是float值int() argument must be a string, a bytes-like object or a real number, not 'set':集合类型无法直接转为int类型
解决步骤
1. 排查数据异常
先查看目标列的数据类型和样本值,确认异常数据形态:
# 查看列数据类型 print(mask[['irs_pop', 'latitude', 'longitude', 'fips']].dtypes) # 查看前10行样本 print(mask[['irs_pop', 'latitude', 'longitude', 'fips']].head(10))
2. 清洗集合类型数据
定义通用清洗函数,将集合转为可处理的数值/字符串,空集合转为NaN:
import numpy as np def clean_set_value(x): if isinstance(x, set): if not x: return np.nan x_list = list(x) # 集合内是数值则取第一个元素,是字符串则拼接 return x_list[0] if isinstance(x_list[0], (int, float)) else ','.join(x_list) return x # 应用到所有目标列 cols_to_clean = ['irs_pop', 'latitude', 'longitude', 'fips'] for col in cols_to_clean: mask[col] = mask[col].apply(clean_set_value)
3. 处理缺失值并转换类型
根据列的业务含义填充缺失值,再转换类型:
# irs_pop(人口数):用均值填充后转int mask['irs_pop'] = mask['irs_pop'].fillna(mask['irs_pop'].mean()).astype('int64') # latitude/longitude(经纬度):用均值填充后转float mask['latitude'] = mask['latitude'].fillna(mask['latitude'].mean()).astype('float64') mask['longitude'] = mask['longitude'].fillna(mask['longitude'].mean()).astype('float64') # fips(地区编码):用众数填充后转int(或直接删除缺失行) mask['fips'] = mask['fips'].fillna(mask['fips'].mode()[0]).astype('int64')
内容的提问来源于stack exchange,提问作者oToMaTiX
相关产品推荐
相关产品推荐

