何百もの列を持つ2つのCSV_fileがあり、2つのCSV_fileの同じ列ごとにピアソン相関係数とp値を計算したいと思います。問題は、1つの列に欠落データ「NaN」があると、エラーになるということです。 「.dropna」が列からnan値を削除すると、XとYの形状が(削除されたnan値に基づいて)等しくないことがあり、次のエラーを受け取ります。
「ValueError:オペランドは形状(1020、)(1016、)と一緒にブロードキャストできませんでした」
質問:「nan」の1つの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')
これが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.])
Dropnaの代わりに、isnanおよびbooleanインデックスを使用してみてください。
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.
お役に立てば幸いです。
それらを1つの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)
また、forループなしでcsvすることもできます。読み取り pandas.DataFrame.to_csv