今天在使用python的seaborn画热图(clustermap)的时候,发现了总是出现这个错误,而且可以知道自己的数据完全是符合条件的,在搜索了谷歌后也没有找到好的解决方法,经过摸索后这里把最终解决方法告诉大家。

1.生成dataframe

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from seaborn import clustermap
    import seaborn as sns; sns.set(color_codes=True)
    df = pd.DataFrame([["a","b","c","d","e","f"],[1,2,3,4,5,6],[2,3,4,5,6,7],[3,4,5,6,7,8]],  columns=list('ABCDEF')).T
    df
    g = sns.clustermap(df.iloc[:,1:],cmap="PiYG")

生成dataframe并转置后,出现类型错误,TypeError: ufunc ‘isnan’ not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ”safe”

《TypeError: ufunc ‘isnan’ not supported for the input types解决办法》

2.出错原因

出现这类错误在于dataframe经过了转置,而原来的dataframe中包含字符串的列,就像上面的例子中一样第一列是字符串,值为abcdef。那么经过转置后的dataframe所有的数字也全部变成了object而不再是float或者int的数字类型,所以当我们队字符类型进行热图绘制的时候自然出错。

这里如果dataframe本来全是数字型的话就不会出问题。

3.解决办法

知道原因,那么解决办法就简单了,把转置后的dataframe对应的数字列进行数字的转换就可以了,上代码

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from seaborn import clustermap
    import seaborn as sns; sns.set(color_codes=True)
    df = pd.DataFrame([["a","b","c","d","e","f"],[1,2,3,4,5,6],[2,3,4,5,6,7],[3,4,5,6,7,8]],  columns=list('ABCDEF')).T
    df[1] = pd.Series(df[1]).astype(float)
    df[2] = pd.Series(df[2]).astype(float)
    df[3] = pd.Series(df[3]).astype(float)
    g = sns.clustermap(df.iloc[:,1:],cmap="PiYG")

使用pandas的Series类型转换函数astype将对应的列转变为float类型,便可以绘制聚类热图了。

《TypeError: ufunc ‘isnan’ not supported for the input types解决办法》