DataFrame相关性计算结果为NaN,尽管所有值都是整数

25 投票
2 回答
45242 浏览
提问于 2025-04-17 23:56

我有一个数据表 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

撰写回答