这里的问题不在于数据框本身,而在于它的来源。我在使用数据框中的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 实现的正确解释。