Python pandas 返回空的相关矩阵。

48

我正在运行Python 2.7.6,pandas 0.13.1。我无法从DataFrame计算相关矩阵,也不确定原因。这是我的示例DataFrame(foo):

                       A             B            C
2011-10-12   0.006204908 -0.0009503677  0.003480105
2011-10-13    0.00234903 -0.0005122284 -0.001738786
2011-10-14    0.01045599   0.000346268  0.002378351
2011-10-17   0.003239088   0.001246239 -0.002651856
2011-10-18   0.001717674 -0.0001738079  0.002013923
2011-10-19  0.0001919342  6.399505e-05 -0.001311259
2011-10-20  0.0007430615   0.001186141  0.001919222
2011-10-21   -0.01075129    -0.0015123  0.000807017
2011-10-24   -0.00819597 -0.0005124197  0.003037654
2011-10-25   -0.01604287   0.001157013 -0.001227516

现在我将尝试计算相关性:
In [27]: foo.corr()
Out[27]:
Empty DataFrame
Columns: []
Index: []
[0 rows x 0 columns]

另一方面,我可以计算每一列与其他每一列之间的相关性。例如:
foo['A'].corr(foo['B'])
# 0.048578514633405255

有任何想法是什么导致了这个问题吗?


2
你使用的是哪个版本? df = pd.DataFrame(np.random.randn(10,3), columns=list('ABC'), index=pd.date_range('2012-01-01', periods=10)); df.corr() 对我有效。 - joris
你的例子对我也有效。 - Max
21
看起来你的数据类型是“object”(见浮点数没有对齐)。使用“astype(float)”转换一下数据类型,或者更好的方法是,数据来自哪里?请发布“foo.dtypes”。 - Jeff
啊...好发现Jeff!这很奇怪。我不确定数据是如何转换为对象类型的,但我一定会深入挖掘。非常感谢你的指引。 - Max
哇,Jeff非常感谢。我也遇到了类似的问题,因为我使用了Decimal对象。 - etandel
我觉得Pandas应该返回一个错误而不是一个空的数据框。很奇怪。 - zthomas.nc
2个回答

75

正如Jeff在评论中提到的,问题是由于我的列具有object数据类型导致的。以后请注意,即使该对象看起来是数字,也要检查其数据类型并确保它是数字类型(例如执行 foo.astype(float))后再计算相关矩阵。


1
自pandas 1.5.0起,corr()有一个numeric_only=参数。如果数据框中的值可以安全地转换为浮点数,即如果df.astype(float)不会引发错误,则设置numeric_only=False使corr()适用于对象/字符串/十进制数据。
df.corr(numeric_only=False)

例子:

from decimal import Decimal
df = pd.DataFrame({
    'A': ['0.006204908', '0.00234903', '0.01045599', '0.001717674'],
    'B': [Decimal('-0.07'), Decimal('-0.04'), Decimal('0.08'), Decimal('-0.07')],
    'C': ['0.003480105', '-0.001738786', '0.002378351', '-0.002651856']})


# pandas < 1.5.0
df.corr()

Empty DataFrame
Columns: []
Index: []


# pandas >= 1.5.0
df.corr(numeric_only=False)

          A         B         C
A  1.000000  0.816457  0.827324
B  0.816457  1.000000  0.369191
C  0.827324  0.369191  1.000000

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