熊猫数据框的热图图-TypeError

时间:2018-08-10 15:49:22

标签: python pandas matplotlib typeerror

我有两个熊猫数据框,在检查时看起来是相同的。一个是使用内置的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。有办法删除它吗?

1 个答案:

答案 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)
相关问题