使用numpy.corrcoef计算DataFrame相关性时遇类型不支持错误求助
解决numpy计算DataFrame相关性时的
float与str类型错误 你遇到的unsupported operand type(s) for +: 'float' and 'str'错误,核心原因是合并后的df_col里存在字符串类型的列,而numpy的corrcoef只能处理纯数值型数据,当它尝试对字符串和数值做运算时就会抛出这个错误。
先看你代码里的几个小问题:
pd.read_csv()本身返回的就是DataFrame,不需要再用pd.DataFrame()重新包装,这一步完全多余;- 合并后没有做任何数据清洗和类型检查,直接就丢给numpy计算,很容易踩类型的坑。
下面是具体的解决步骤和修改后的代码:
1. 先排查问题:检查数据类型
首先要确认哪些列是字符串(object类型):
print(df_col.dtypes)
输出里标为object的列就是可疑的字符串列,可能是包含文本描述、用字符串表示的缺失值(比如'NA'、'-')或者格式错误的数值。
2. 清洗数据:处理非数值列和缺失值
方案一:直接保留数值型列
如果某些字符串列是无关的(比如备注、名称类),可以直接筛选出所有数值列:
# 只保留整数和浮点数类型的列 numeric_df = df_col.select_dtypes(include=['int64', 'float64'])
方案二:修复字符串格式的缺失值
如果字符串列其实是数值,但用了特殊字符表示缺失,先把这些字符替换成numpy的NaN,再处理缺失值:
# 替换常见的字符串缺失值为NaN df_col = df_col.replace(['NA', '--', ' ', 'nan'], np.nan) # 筛选数值列 numeric_df = df_col.select_dtypes(include=['int64', 'float64']) # 填充缺失值(用均值,也可以用中位数或者直接删除含缺失值的行) numeric_df = numeric_df.fillna(numeric_df.mean())
3. 计算相关性:选更适配的工具
其实pandas本身就提供了专门针对DataFrame的相关性计算方法corr(),比numpy的corrcoef更友好,它会自动忽略非数值列(处理好缺失值后):
# pandas内置的相关性矩阵计算 corr_matrix = numeric_df.corr() print(corr_matrix)
如果一定要用numpy的corrcoef,需要注意:它默认按行计算相关性,而我们的DataFrame是列代表变量,所以需要转置后再传入:
# numpy计算相关性,记得转置数据 np_corr = np.corrcoef(numeric_df.T) print(np_corr)
修改后的完整代码
import pandas as pd import numpy as np # 读取数据(无需额外转成DataFrame) usd = pd.read_csv("data_usd.csv") emas = pd.read_csv("emas_.csv") minyak = pd.read_csv("minyak_brent.csv") sawit = pd.read_csv("sawit.csv") kcl = pd.read_csv("kcl.csv") fosfat = pd.read_csv("fosfat.csv") # 合并数据并设置索引 df_col = pd.concat([usd, emas, minyak, sawit, kcl, fosfat], axis=1) df_col = df_col.set_index('month') # 检查数据类型,排查字符串列 print("各列数据类型:") print(df_col.dtypes) # 数据清洗 df_col = df_col.replace(['NA', '--', ''], np.nan) numeric_df = df_col.select_dtypes(include=['int64', 'float64']) numeric_df = numeric_df.fillna(numeric_df.mean()) # 用pandas计算相关性(推荐) print("\nPandas相关性矩阵:") print(numeric_df.corr()) # 用numpy计算相关性 print("\nNumpy相关性矩阵:") print(np.corrcoef(numeric_df.T))
内容的提问来源于stack exchange,提问作者adinda aulia
相关产品推荐
相关产品推荐

