皮尔逊相关性和楠值



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

"值错误:操作数无法与形状一起广播 (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 个 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.])

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

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.

希望对您有所帮助!

为什么不将它们组合成一个 df 并在其上使用 dropna。将删除所有值。

newdf=pd.concat([df, dg], axis=1, sort=False)
newdf.dropna()

我建议获取两个 df 的列名列表,并在 for 循环中使用它:

dfnames=list(df.columns.values)
dgnames=list(dg.columns.values)
for i in range(len(dfnames)):
    X= newdf[dfnames[i]].dropna(axis=0, how='any')
    Y= newdf[dgnames[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)

此外,您可以只 CSV 而不使用 for 循环。 阅读熊猫。DataFrame.to_csv

相关内容

  • 没有找到相关文章

最新更新