为何Pandas DataFrame所有列均为numpy object而非float类型?
问题解决思路
问题根源在于applymap逐元素处理后,Pandas可能因元素返回的类型细节(比如numpy float与Python float混合)自动将列转为object类型,而scipy的t-test对输入类型要求严格,不像PCA、seaborn会自动做隐式类型转换。
以下是直接有效的解决方案:
替换applymap为矢量化运算(推荐):
直接对整个DataFrame做矢量化对数变换,Pandas会自动维持数值类型,效率也更高:master_data = np.log(master_data + 1)若不想覆盖原数据,可指定赋值范围:
master_data.loc[:, :] = np.log(master_data + 1)强制转换现有数据类型:
已经用applymap处理完的话,直接把整个DataFrame转为float类型:master_data = master_data.astype(np.float64)担心存在非数值元素报错的话,可添加参数将无法转换的内容转为NaN:
master_data = master_data.astype(np.float64, errors='coerce')读入文件时直接指定数值类型:
从根源避免类型问题,读取tsv文件时就明确指定数据类型:master_data = pd.read_csv('your_file.tsv', sep='\t', dtype=np.float64)
补充说明:PCA和seaborn能正常运行,是因为它们内部会尝试将可转换为数值的object列自动转为数值类型,但scipy的统计函数不会做这种隐式转换,因此必须确保输入是严格的数值类型数组或DataFrame。
内容的提问来源于stack exchange,提问作者Tony_stark
相关产品推荐
相关产品推荐

