问题描述:
用pandas清洗数据时发现爆出告警,且清洗出来的数据大小格式不对
DtypeWarning: Columns (2) have mixed types. Specify dtype option on import or set low_memory=False
意思是第二列出现类型混乱,原因如下
pandas读取csv文件默认是按块读取的,即不一次性全部读取;
另外pandas对数据的类型是完全靠猜的,所以pandas每读取一块数据就对csv字段的数据类型进行猜一次,所以有可能pandas在读取不同块时对同一字段的数据类型猜测结果不一致。
解决方法:
方法一:
按照提示,读入数据时指定参数low_memory=False,可以部分解决这类问题。
原来代码:
data1 = pandas.read_csv(sheet_names[i], header=None, names=['BatteryCode', 'ParameterCode', 'Value'])
添加指定参数后:
data1 = pandas.read_csv(sheet_names[i], header=None, names=['BatteryCode', 'ParameterCode', 'Value'], low_memory=False)
方法二:
给出现问题的混合类型(mixed types)的列,指定类型。
代码示例:
data1 = pandas.read_csv(sheet_names[i],
header=None,
names=['BatteryCode', 'ParameterCode', 'Value'],
dtype={'BatteryCode': 'str', 'ParameterCode': 'str', 'Value': 'float'}) # 读文件
总结:
low_memory=False 参数设置后,pandas会一次性读取csv中的所有数据,然后对字段的数据类型进行唯一的一次猜测。这样就不会导致同一字段的Mixed types问题了。
但是这种方式真的非常不好,一旦csv文件过大,就会内存溢出;所以推荐用第2种解决方案。