DataFrame相关性计算结果为NaN,尽管所有值都是整数
我有一个数据表 df
,它的样子是这样的:
0 1 2 3 4 5 6 7 8
0 2014-03-19T12:44:32.695Z 1395233072695 703425 0 2 1 13 5 21
1 2014-03-19T12:44:32.727Z 1395233072727 703425 0 2 1 13 5 21
这些列的数据类型都是整数(除了第一列):
0 object
1 int64
2 int64
3 int64
4 int64
5 int64
6 int64
7 int64
8 int64
但是在我计算相关性的时候,有些列似乎是 NaN。也就是说,它们的值是空的。当我调用 df.corr()
时,得到的结果是:
1 2 3 4 5 6 7 8
1 1.000000 NaN 0.018752 -0.550307 NaN NaN 0.075191 0.775725
2 NaN NaN NaN NaN NaN NaN NaN NaN
3 0.018752 NaN 1.000000 -0.067293 NaN NaN -0.579651 0.004593
...
2 个回答
0
正如 @Karl D. 提到的,如果某一列的值都是一样的,那这列就没有变化,也就是说这些值是恒定的。随机变量和一个恒定值之间的关系是无法定义的。换句话说,如果把这列画成图,它会是一条水平线,这意味着它和图上其他的线没有“一起变化”。
如果我们想要一个相关性矩阵,一种方法就是直接去掉那些相关性无法定义的列:
corr = df.corr()
corr_notna = ~corr.isna().all()
corr = corr.loc[corr_notna, corr_notna]
# or as a one-liner
corr = df.corr().dropna(how='all', axis=1).dropna(how='all')
一个恒定的列和另一个随机变量之间的相关性要么是1,要么是-1。举个例子:
df = pd.DataFrame({'A': [1]*5, 'B': [*[1]*4, 0]})
df.corr()
df.corr()
A B
A NaN NaN
B NaN 1.0
df['B-A'] = df['B'] - df['A']
df[['B', 'B-A']].corr()
B B-A
B 1.0 1.0
B-A 1.0 1.0
另外一种得到NaN的情况是数据不够多,特别是当 min_periods=
设置了一个数字时。举个例子:
df = pd.DataFrame({'A': [*range(9), float('nan')], 'B': range(10)})
df.corr(min_periods=10)
A B
A NaN NaN
B NaN 1.0
41
这些列现在的值确实没有变化。
正如Joris所提到的,如果值没有变化,你会期待看到NaN
。为了理解这个原因,我们来看一下相关性公式:
cor(i,j) = cov(i,j)/[stdev(i)*stdev(j)]
如果第i个或第j个变量的值没有变化,那么它们的标准差就会是零,这样分母也会变成零。因此,相关性就会是NaN
。