Pandas .corr()返回“__”

83qze16e  于 2023-04-28  发布在  其他
关注(0)|答案(3)|浏览(166)

它一直运行得很好,直到它不工作了,我不知道我做错了什么。我把它简化成一个非常简单的数据集:
返回“__”

sns.热图(corr)
抛出以下错误“zero-size array to reduction operation minimum which has no identity”
我不知道出了什么问题?我已经尝试了更多的行等,并仔细检查,我没有任何缺失值......发生了什么事?我有这样一个漂亮的热图早些时候,我一直在尝试

dohp0rv5

dohp0rv51#

如上所述,将类型更改为float。简单地说,

corr = t.astype('float64').corr()
amrnrhlw

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实现的正确解释。

lrl1mhuk

lrl1mhuk3#

如果在Pandas DataFrame上调用.corr()方法时看到“__”,则两列之间的相关系数是未定义的。基本上,无法计算相关矩阵,因为DataFrame中有一些缺失或未定义的数据。
要解决这个问题,您必须处理DataFrame中的NaN(非数字)值。这里有几个选项,但一种常见的方法是使用.fillna()方法用特定值填充NaN值。
例如,假设您有一个名为df的DataFrame,其中包含一些NaN值

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 = df.fillna(df.mean())

这将用相应列的平均值替换每个NaN值。填写NaN值后,您应该能够调用.corr()而不会得到任何“”值。
如果在填充NaN值后仍然看到“
”值,可能是因为其中一列或两列的标准差为零。在这种情况下,可以尝试使用.dropna()方法删除具有NaN值的行或列。

相关问题