Pandas的.corr()方法返回“__”。

4

一直运行良好,但突然出现问题,不知道哪里做错了。我已将其简化为一个非常简单的数据集t:

    1   2   3   4   5   6   7   8
0   3   16  3   2   17  2   3   2
1   3   16  3   2   19  4   3   2
2   3   16  3   2   9   2   3   2
3   3   16  3   2   19  1   3   2
4   3   16  3   2   17  2   3   1
5   3   16  3   2   17  1   17  1
6   3   16  3   2   19  1   17  2
7   3   16  3   2   19  4   3   1
8   3   16  3   2   19  1   3   2
9   3   16  3   2   7   2   17  1




corr = t.corr()
corr

返回 "__"

sns.heatmap(corr)

抛出以下错误"zero-size array to reduction operation minimum which has no identity"

我不知道出了什么问题?我已经尝试了更多的行等,还仔细检查了没有任何缺失值......发生了什么?之前我的热力图很漂亮,我一直在尝试。


在我的端上工作。。 - BENY
我尝试了你代码中的内容,返回了一个矩阵,其中前四列出现了NaN结果。这可能是因为这些列具有恒定值,并且在pd.corr方法中默认相关度量是Pearson公式,这意味着两个变量之间的协方差除以它们各自的方差。由于恒定值的方差为零,所以你必须检查一下你的数据集有什么问题。 - SalvadorViramontes
它恰好在前几行具有相同的值,我扩展了它以确保它们具有不同的值,但仍然存在相同的问题。奇怪的是你说你实际上得到了一个带有NaN的矩阵,而另一个人则说他已经完全解决了这个问题。但是min返回一个空数据框。我完全启动了一个新会话,以确保没有其他问题发生,但仍然只能得到一个空数据框。 - L Xandor
3个回答

6

如上所述,将变量类型更改为浮点数。简而言之,

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

1
这里的问题不在于数据框本身,而在于它的来源。我在使用数据框中的drop或iloc时也遇到了同样的问题。关键在于数据框所具有的全局类型。 假设我们有以下数据框:
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),你会得到:
{'_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 Items: RangeIndex(start=0, stop=8, step=1) Axis 1: RangeIndex(start=1, stop=4, step=1) FloatBlock: slice(0, 8, 1), 8 x 3, dtype: float64, '_item_cache': {}}

这里 dtype 仍然是 float64。

第三个数据框可以被定义:

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',因为数据框中的类型不一致。字符串和浮点数混合在一起。最后,可以生成第四个数据框:

 list_new_new_w = list_ex_new_w.iloc[1:,:]

这将生成一个相同的笔记本,但没有'a',显然是一个完全正确的数据框来计算相关性。然而,这将再次返回一个空的数据框。对数据框属性的最后检查显示:
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方法将返回一个空的数据框。可以通过使用astype(float)来解决这个问题。

 list_new_new_w.astype(float).corr()

总之,似乎在 pandas 中,当调用 corr 或 cov 等方法时,会生成一个新的 dataframe,它具有相同的属性,忽略大小写,新的 dataframe 具有一致的全局类型。我一直在查看 pandas 的源代码,我理解这是 pandas 实现的正确解释。


1
如果在调用Pandas DataFrame的.corr()方法时看到“__”,则两列之间的相关系数未定义。基本上,由于数据框中存在一些缺失或未定义的数据,因此无法计算相关矩阵。
要解决此问题,您必须处理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值的行或列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接