它一直运行得很好,直到它不工作了,我不知道我做错了什么。我把它简化成一个非常简单的数据集:返回“__”和sns.热图(corr)抛出以下错误“zero-size array to reduction operation minimum which has no identity”我不知道出了什么问题?我已经尝试了更多的行等,并仔细检查,我没有任何缺失值......发生了什么事?我有这样一个漂亮的热图早些时候,我一直在尝试
dohp0rv51#
如上所述,将类型更改为float。简单地说,
corr = t.astype('float64').corr()
amrnrhlw2#
这里的问题不是 Dataframe 本身,而是它的起源。我在 Dataframe 中使用drop或iloc发现了同样的问题。关键是 Dataframe 的全局类型。假设我们有以下 Dataframe :
list_ex = [[1.1,2.1,3.1,4,5,6,7,8],[1.2,2.2,3.3,4.1,5.5,6,7,8], [1.3,2.3,3,4,5,6.2,7,8],[1.4,2.4,3,4,5,6.2,7.3,8.1]] list_ex_new=pd.DataFrame(list_ex)
你可以毫无问题地计算list_ex_new.corr()。如果你通过vars(list_ex_new)检查dataframe的参数,你会得到:
{'_is_copy': None, '_data': BlockManager Items: RangeIndex(start=0, stop=8, step=1) Axis 1: RangeIndex(start=0, stop=4, step=1) FloatBlock: slice(0, 8, 1), 8 x 4, dtype: float64, '_item_cache': {}}
其中dtype是float64。可以通过list_new_new = list_ex_new.iloc[1:,:]定义一个新的数据框,并且可以成功地评估相关性。对数据框属性的检查显示:'_ is_copy ':,'_data':BlockManager项目:RangeIndex(start=0,stop=8,step=1)轴1:RangeIndex(start=1,stop=4,step=1)FloatBlock:slice(0,8,1),8 x 3,dtype:float64,'_item_cache':{}}其中dtype仍然是float64。可以定义第三 Dataframe :
list_ex_w = [['a','a','a','a','a','a','a','a'],[1.1,2.1,3.1,4,5,6,7,8], [1.2,2.2,3.3,4.1,5.5,6,7,8],[1.3,2.3,3,4,5,6.2,7,8], [1.4,2.4,3,4,5,6.2,7.3,8.1]] list_ex_new_w=pd.DataFrame(list_ex_w)
对数据框的相关性的评估将导致空数据框,因为list_ex_w属性看起来像:
{'_is_copy': None, '_data': BlockManager Items: RangeIndex(start=0, stop=8, step=1) Axis 1: Index(['a', 1, 2, 3, 4], dtype='object') ObjectBlock: slice(0, 8, 1), 8 x 5, dtype: object, '_item_cache': {}}
现在dtype是'object',因为dataframe的类型不一致。有字符串和浮点数在一起。最后,可以生成第四个dataframe:
list_new_new_w = list_ex_new_w.iloc[1:,:]
这将生成相同的notebook,但没有'a',显然是一个完全正确的dataframe来计算相关性。然而,这将再次返回一个空的dataframe。dataframe属性的最终检查显示:
vars(list_new_new_w) {'_is_copy': None, '_data': BlockManager Items: Index([1, 2, 3, 4], dtype='object') Axis 1: RangeIndex(start=0, stop=8, step=1) ObjectBlock: slice(0, 4, 1), 4 x 8, dtype: object, '_item_cache': {}}
其中dtype仍然是object,因此方法corr返回一个空的 Dataframe 。这个问题可以通过使用astype(float)来解决。
list_new_new_w.astype(float).corr()
总而言之,似乎pandas在调用corr或cov等方法时会生成一个具有相同属性的新数据框,而忽略了新数据框具有一致全局类型的情况。我一直在检查pandas的源代码,我理解这是对pandas实现的正确解释。
lrl1mhuk3#
如果在Pandas DataFrame上调用.corr()方法时看到“__”,则两列之间的相关系数是未定义的。基本上,无法计算相关矩阵,因为DataFrame中有一些缺失或未定义的数据。要解决这个问题,您必须处理DataFrame中的NaN(非数字)值。这里有几个选项,但一种常见的方法是使用.fillna()方法用特定值填充NaN值。例如,假设您有一个名为df的DataFrame,其中包含一些NaN值
.corr()
.fillna()
df
import pandas as pd df = pd.DataFrame({ 'A': [1, 2, 3, 4, 5], 'B': [2, 4, None, 8, 10], 'C': [3, 6, 9, None, 15] })
要使用列的平均值填充NaN值,可以使用df.fillna(df.mean())
df.fillna(df.mean())
df = df.fillna(df.mean())
这将用相应列的平均值替换每个NaN值。填写NaN值后,您应该能够调用.corr()而不会得到任何“”值。如果在填充NaN值后仍然看到“”值,可能是因为其中一列或两列的标准差为零。在这种情况下,可以尝试使用.dropna()方法删除具有NaN值的行或列。
.dropna()
3条答案
按热度按时间dohp0rv51#
如上所述,将类型更改为float。简单地说,
amrnrhlw2#
这里的问题不是 Dataframe 本身,而是它的起源。我在 Dataframe 中使用drop或iloc发现了同样的问题。关键是 Dataframe 的全局类型。假设我们有以下 Dataframe :
你可以毫无问题地计算list_ex_new.corr()。如果你通过vars(list_ex_new)检查dataframe的参数,你会得到:
其中dtype是float64。
可以通过list_new_new = list_ex_new.iloc[1:,:]定义一个新的数据框,并且可以成功地评估相关性。对数据框属性的检查显示:'_ is_copy ':,'_data':BlockManager项目:RangeIndex(start=0,stop=8,step=1)轴1:RangeIndex(start=1,stop=4,step=1)FloatBlock:slice(0,8,1),8 x 3,dtype:float64,'_item_cache':{}}
其中dtype仍然是float64。
可以定义第三 Dataframe :
对数据框的相关性的评估将导致空数据框,因为list_ex_w属性看起来像:
现在dtype是'object',因为dataframe的类型不一致。有字符串和浮点数在一起。最后,可以生成第四个dataframe:
这将生成相同的notebook,但没有'a',显然是一个完全正确的dataframe来计算相关性。然而,这将再次返回一个空的dataframe。dataframe属性的最终检查显示:
其中dtype仍然是object,因此方法corr返回一个空的 Dataframe 。这个问题可以通过使用astype(float)来解决。
总而言之,似乎pandas在调用corr或cov等方法时会生成一个具有相同属性的新数据框,而忽略了新数据框具有一致全局类型的情况。我一直在检查pandas的源代码,我理解这是对pandas实现的正确解释。
lrl1mhuk3#
如果在Pandas DataFrame上调用
.corr()
方法时看到“__”,则两列之间的相关系数是未定义的。基本上,无法计算相关矩阵,因为DataFrame中有一些缺失或未定义的数据。要解决这个问题,您必须处理DataFrame中的NaN(非数字)值。这里有几个选项,但一种常见的方法是使用
.fillna()
方法用特定值填充NaN值。例如,假设您有一个名为
df
的DataFrame,其中包含一些NaN值要使用列的平均值填充NaN值,可以使用
df.fillna(df.mean())
这将用相应列的平均值替换每个NaN值。填写NaN值后,您应该能够调用
.corr()
而不会得到任何“”值。如果在填充NaN值后仍然看到“”值,可能是因为其中一列或两列的标准差为零。在这种情况下,可以尝试使用
.dropna()
方法删除具有NaN值的行或列。