DataFrame 相关性会产生 NaN,尽管其值都是整数

问题描述 投票:0回答:3

我有一个数据框

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

这些列都是 int 类型(第一列除外):

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
...
python pandas dataframe nan correlation
3个回答
41
投票

这些列的值现在不会改变,是的

Joris 指出,如果这些值没有变化,您会期望

NaN
。要了解原因,请查看相关公式:

cor(i,j) = cov(i,j)/[stdev(i)*stdev(j)]

如果第 i 个或第 j 个变量的值不变,则各自的标准差将为零,分数的分母也将为零。因此,相关性将为

NaN


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

0
投票

我有类似的问题,我检查了数据集的标准差,它们不为零。我检查了我的数据中是否有 NaN 值,但没有。但我得到的相关性为 NaN。除了没有相关性之外还有其他可能的原因吗?

© www.soinside.com 2019 - 2024. All rights reserved.