Pandas .corr() 返回“__”
Posted
技术标签:
【中文标题】Pandas .corr() 返回“__”【英文标题】:Pandas .corr() returning "__" 【发布时间】:2019-08-10 13:55:54 【问题描述】:它工作得很好,直到它没有,并且不知道我做错了什么。我已将其简化为一个非常简单的数据集 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)
抛出以下错误“零大小数组到没有标识的归约操作最小值”
我不知道怎么了?我已经尝试了更多行等,并仔细检查了我没有缺失值......这是怎么回事?我之前有这么漂亮的热图,我一直在尝试
【问题讨论】:
在我身边工作.. 我已经尝试了您的代码并返回了一个矩阵,其中前四列出现 NaN 结果,这一定是因为这些列具有恒定值并且来自此 pd 中的默认相关度量.corr 方法是皮尔逊公式,这意味着两个变量之间的协方差并除以它们各自的方差。而且因为常数值的方差为零,所以你必须看看你拥有的这个数据集有什么问题 前几行的值恰好相同,我对其进行了扩展以确保它们具有不同的值并且仍然存在相同的问题。奇怪的是,您说您实际上与 Nans 有一个矩阵,而另一个人说他得到了充分的工作。但 min 返回一个空数据框。我完全开始了一个新会话以确保没有其他事情发生,但仍然只是得到一个空的数据框 【参考方案1】:如上所述,将类型更改为浮动。很简单,
corr = t.astype('float64').corr()
【讨论】:
【参考方案2】:这里的问题不是数据框本身,而是它的来源。我通过在数据框中使用 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':块管理器 项目: RangeIndex(start=0, stop=8, step=1) 轴 1: RangeIndex(start=1, stop=4, step=1) FloatBlock:切片(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 仍然是对象,因此方法 corr 返回一个空数据帧。 这个问题可以使用 astype(float) 来解决
list_new_new_w.astype(float).corr()
总而言之,在调用 corr 或 cov 等方法时,pandas 似乎会生成一个具有相同属性的新数据帧,而忽略了新数据帧具有一致的全局类型的情况。我一直在查看 pandas 源代码,我知道这是对 pandas 实现的正确解释。
【讨论】:
以上是关于Pandas .corr() 返回“__”的主要内容,如果未能解决你的问题,请参考以下文章
python_执行报错_No module named 'pandas'
pandas一些基本操作(DataFram和Series)_4