首页 > 解决方案 > Python Pandas 和 Spearmanr 按行运行更快

问题描述

我正在尝试获取两个数据帧并运行逐行 spearmanr 相关性。我已经设置了代码以便它运行,但它需要很长时间,我希望有更好/更快的方法来运行它。这些表看起来像这样:

df1 (50x14492):

TYPE GENRE1 GENRE2
Name1 .0945 .0845
Name2 .9074 Nan
Name3 1     0

和 df2 (50x14492):

TYPE GENRE1 GENRE2
Name1 .9045 .895
Name2 .074  1
Name3 .5    .045

我想获取 df1.Name1 和 df2.Name2 的相关信息,所以我有一个字典,上面写着 {Name1:corr, Name2:corr2} 所以我有以下代码。

for df1_row in df1.itertuples():
    for df2_row in df2.itertuples():
        if df2_row.TYPE.upper() == df1_row.TYPE.upper():
            df1_val_array = list(df1_row)
            df2_val_array = list(df2_row)
            df1_val_array = df1_val_array[2:]
            df2_val_array = df2_val_array[2:]
            df1_df2_gene_corr, df1_df2_gene_p_val = scipy.stats.spearmanr(df1_val_array, df2_val_array, axis=0, nan_policy='omit')
            correlation_dict[df2_row.TYPE.upper()] = df1_df2_gene_corr

# plot correlations
plt.plot(list(correlation_dict.keys()), correlation_dict.values())
plt.show()

无论如何,由于数据长度,这样做不会永远花费?

标签: pythonpandasscipy

解决方案


如果我理解正确,试试这个:

from scipy.stats import spearmanr as spr

df1 = df1.set_index('TYPE')
df2 = df2.set_index('TYPE')

df1, df2 = df1.align(df2)

def scorr(t):
  return spr(*t, axis=0, nan_policy='omit').correlation

pd.Series([*map(scorr, zip(df1.values, df2.values))], df1.columns)

推荐阅读