比较列和行上的两个 pandas 数据帧

Comparing two pandas dataframes on column and the row

我有两个 pandas 数据帧,它们看起来差不多,但存储的信息不同。我的问题将是关于如何比较两个数据帧以确保在执行某些分析之前列和行匹配并获得两者之间相关性的第三个数据帧。

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

希望的结果df3尚未获得(50x14492):

TYPE GENRE1                  GENRE2
Name1 spearsonr(.9045,.9045) spearsonr(.0845,.895)
Name2 spearsonr(.9074,.074)  spearsonr(Nan,1)
Name3 spearsonr(1,.5)        spearsonr(0,.045)

我想将 df1.GENRE1.Name1 与 df2.GENRE1.Name1 进行比较,但在实现过程中迷失了方向。为此,我有以下代码:

for key1, value1 in df1.iteritems():
    for key2, value2 in df2.iteritems():
        if key1 == key2:
           # this gets me to df1.GENRE1 == df2.GENRE1
           for newkey1, newval1 in key1.iterrows():
               for newkey2, newval2 in key2.iterrows():
                   if newkey1 == newkey2:
                      # this does not seem to get me to df1.GENRE1.Name1 == df2.GENRE1.Name1
                      scipy.stats.spearmanr(newval1, newval2)

这让我可以比较 df1.GENRE1 和 df2.GENRE1,但我不确定如何进入下一个逻辑步骤,同时确保 df1.GENRE1.Name1 == df2.GENRE1.Name1。换一种说法,我不确定现在我有列时如何确保行匹配。

注意: 我尝试在完整的两个数据帧上使用 spearmanr:

corr, p_val = scipy.stats.spearmanr(df1, df2, axis=0, nan_policy='omit')

但我得到的不是相同大小 (50x14492) 的新数据帧,而是 table 100x100。

同样,如果我使用:

corr, p_val = scipy.stats.spearmanr(df1['GENRE1'], df2['GENRE1'], axis=0, nan_policy='omit')

我得到了两列作为一个整体的相关性,而不是该列的每一行。 (大小为 1X14492)

你的问题有点绕。您是否正在尝试获取两个流派列之间的相关性?

如果是这样,您可以简单地调用 DataFrame 中两列的相关性:

scipy.stats.spearmanr(df1['GENRE1'], df2['GENRE1'])

阅读您的评论和编辑后,您似乎想要逐行关联。这是一个简单的 CS 问题,但您应该知道,通过计算两个值之间的相关性,您不会得到任何有意义的结果。它只是未定义或 1。无论如何,这应该按照您上面的要求填充 df3:

df3 = pd.DataFrame()
df3['genre1'] = map(spearmanr, zip(df1['genre1'], df2['genre1']))
df3['genre2'] = map(spearmanr, zip(df1['genre2'], df2['genre2']))