我有两个熊猫数据框,在检查时看起来是相同的。一个是使用内置的Pandas创建的:
df.corr(method='pearson')
另一个是使用自定义函数创建的:
def cor_matrix(dataframe, method):
coeffmat = pd.DataFrame(index=dataframe.columns,
columns=dataframe.columns)
pvalmat = pd.DataFrame(index=dataframe.columns, columns=dataframe.columns)
for i in range(dataframe.shape[1]):
for j in range(dataframe.shape[1]):
x = np.array(dataframe[dataframe.columns[i]])
y = np.array(dataframe[dataframe.columns[j]])
bad = ~np.logical_or(np.isnan(x), np.isnan(y))
if method == 'spearman':
corrtest = spearmanr(np.compress(bad,x), np.compress(bad,y))
if method == 'pearson':
corrtest = pearsonr(np.compress(bad,x), np.compress(bad,y))
coeffmat.iloc[i,j] = corrtest[0]
pvalmat.iloc[i,j] = corrtest[1]
return (coeffmat, pvalmat)
两者看起来相同,并且具有相同的类型(pandas.core.frame.DataFrame),并且它们的条目也具有相同的类型(numpy.float64)
但是,当我尝试使用以下方式绘制这些图形时:
import matplotlib.pyplot as plt
plt.imshow((df))
只有使用pandas内置函数创建的数据框有效。对于其他数据框,我收到错误:TypeError:无法将图像数据转换为float。谁能解释这是怎么回事,两个数据框如何不同,以及如何解决错误?
编辑-好像有一个区别,当我将数据帧转换为numpy数组时,一个不起作用的数组最后是dtype = object。有办法删除它吗?
答案 0 :(得分:0)
修改将数据框指定为float的功能可解决以下问题:
def cor_matrix(dataframe, method):
coeffmat = pd.DataFrame(index=dataframe.columns, columns=dataframe.columns)
pvalmat = pd.DataFrame(index=dataframe.columns, columns=dataframe.columns)
for i in range(dataframe.shape[1]):
for j in range(dataframe.shape[1]):
x = np.array(dataframe[dataframe.columns[i]])
y = np.array(dataframe[dataframe.columns[j]])
bad = ~np.logical_or(np.isnan(x), np.isnan(y))
if method == 'spearman':
corrtest = spearmanr(np.compress(bad,x), np.compress(bad,y))
if method == 'pearson':
corrtest = pearsonr(np.compress(bad,x), np.compress(bad,y))
coeffmat.iloc[i,j] = corrtest[0]
pvalmat.iloc[i,j] = corrtest[1]
#This is to convert to float type otherwise can cause problems when e.g. plotting
coeffmat=coeffmat.apply(pd.to_numeric, errors='ignore')
pvalmat=pvalmat.apply(pd.to_numeric, errors='ignore')
return (coeffmat, pvalmat)