比较列和行上的两个熊猫数据框

时间:2018-08-21 18:53:51

标签: python pandas dataframe scipy correlation

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

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),而是获得100x100的表格。

类似地,如果我使用:

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

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

1 个答案:

答案 0 :(得分:1)

您的问题有点令人困惑。您是否要获取两个“类型”列之间的相关性?

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

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

阅读注释并进行编辑后,似乎需要逐行关联。那是一个简单的CS问题,但您应该知道,从两个值之间的相关关系中不会得到任何有意义的东西。它只会是undefined或1。无论如何,应该按照您上面的要求填充df3:

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