TypeError: ufunc 'isnan' not supported for the input types解决办法
今天在使用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”
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类型,便可以绘制聚类热图了。
- 原文作者:春江暮客
- 原文链接:https://www.bobobk.com/245.html
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。