首页 文章

Pearson相关和nan值

提问于
浏览
5

我有两个包含数百列的CSV_files,我想为两个CSV_files的每个相同列计算Pearson相关系数和p值 . 问题是当一列中缺少数据“NaN”时,它会给我一个错误 . 当“.dropna”从列中删除nan值时,有时X和Y的形状不相等(基于移除的nan值)并且我收到此错误:

“ValueError:操作数无法与形状一起广播(1020,)(1016,)”

问题:如果在“nan”中的一个csv中的第8行,是否有任何方法可以从其他csv中删除相同的行,并根据具有两个csv文件值的行对每个列进行分析?

import pandas as pd
import scipy
import csv
import numpy as np
from scipy import stats


df = pd.read_csv ("D:/Insitu-Daily.csv",header = None)
dg = pd.read_csv ("D:/Model-Daily.csv",header = None)

pearson_corr_set = []
pearson_p_set = []


for i in range(1,df.shape[1]):
    X= df[i].dropna(axis=0, how='any')
    Y= dg[i].dropna(axis=0, how='any')

    [pearson_corr, pearson_p] = scipy.stats.stats.pearsonr(X, Y)
    pearson_corr_set = np.append(pearson_corr_set,pearson_corr)
    pearson_p_set = np.append(pearson_p_set,pearson_p)

with open('D:/Results.csv','wb') as file:
    str1 = ",".join(str(i) for i in np.asarray(pearson_corr_set))
    file.write(str1)
    file.write('\n')    
    str1 = ",".join(str(i) for i in np.asarray(pearson_p_set))
    file.write(str1)
    file.write('\n')

2 回答

  • 1

    这是一个解决方案 . 首先计算2个numpy数组的“坏”指数 . 然后掩盖忽略那些坏指数 .

    x = np.array([5, 1, 6, 9, 10, np.nan, 1, 1, np.nan])
    y = np.array([4, 4, 5, np.nan, 6, 2, 1, 8, 1])
    
    bad = ~np.logical_or(np.isnan(x), np.isnan(y))
    
    np.compress(bad, x)  # array([  5.,   1.,   6.,  10.,   1.,   1.])
    np.compress(bad, y)  # array([ 4.,  4.,  5.,  6.,  1.,  8.])
    
  • 5

    而不是dropna,尝试使用isnan和布尔索引:

    for i in range(1, df.shape[1]):
        df_sub = df[i]
        dg_sub = dg[i]
        mask = ~np.isnan(df_sub) & ~np.isnan(dg_sub)  
        # mask array is now true where ith rows of df and dg are NOT nan.
        X = df_sub[mask]  # this returns a 1D array of length mask.sum()
        Y = df_sub[mask]
        ... your code continues.
    

    希望有所帮助!

相关问题