python - 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()
无论如何,由于数据长度,这样做不会永远花费?
解决方案
如果我理解正确,试试这个:
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)
推荐阅读
- ios - Xcode 加载配置文件失败
- python - 使用熊猫,如何从中点生成垃圾箱?
- python - Levenshtein 距离 igonore 悬垂碱基
- git - Windows 上的 Git——所有 Git 客户端都使用相同的配置堆栈,对吗?
- django - 在 Django 应用程序中删除模型后删除模型的内容类型有什么缺点吗?
- python - 可调用是无效的基类?
- java - Java Sqlite 数据库返回空指针异常,除了返回数据
- vue.js - 从 vuex 存储中排序数组(无限渲染警告)
- javascript - 遍历一个数组并将所有字符代码转换为字符?
- android - Android 通知可能会打开应用程序两次(甚至更多次)