基于列条目的两个pandas数据框的交集

28
假设我有两个DataFrame,如下所示:
>>dfA
        S        T            prob
0   ! ! !    ! ! !   8.1623999e-05
1   ! ! !  ! ! ! "   0.00354090007
2   ! ! !  ! ! ! .   0.00210241997
3   ! ! !  ! ! ! ?  6.55684998e-05
4   ! ! !  ! ! !       0.203119993
5   ! ! !  ! ! ! ”  6.62070015e-05
6   ! ! !      ! !   0.00481862016
7   ! ! !        !    0.0274260994
8   ! ! !  " ! ! !  7.99940026e-05
9   ! ! !      " !  1.51188997e-05
10  ! ! !        "  8.50678989e-05

>>dfB
        S        T                              knstats
0   ! ! !  ! ! ! !              knstats=2,391,104,64,25
1   ! ! !  ! ! ! "                 knstats=4,391,6,64,2
2   ! ! !  ! ! ! .                 knstats=4,391,5,64,2
3   ! ! !  ! ! ! ?                 knstats=1,391,4,64,4
4   ! ! !    ! ! !            knstats=220,391,303,64,55
5   ! ! !      ! !            knstats=16,391,957,64,115
6   ! ! !        !           knstats=28,391,5659,64,932
7   ! ! !  " ! ! !                 knstats=2,391,2,64,1
8   ! ! !      " !               knstats=1,391,37,64,13
9   ! ! !        "  knstats=2,391,1.11721e+06,64,180642
10  ! !        . "        knstats=2,391,120527,64,20368

我想创建一个新的DataFrame,它由两个矩阵中具有匹配的"S"和"T"条目的行组成,同时还包括来自dfAprob列和来自dfBknstats列。结果应该看起来像下面这样,并且顺序相同很重要:

       S        T            prob                              knstats
0  ! ! !  ! ! ! !   8.1623999e-05              knstats=2,391,104,64,25
1  ! ! !  ! ! ! "   0.00354090007                 knstats=4,391,6,64,2
2  ! ! !  ! ! ! .   0.00210241997                 knstats=4,391,5,64,2
3  ! ! !  ! ! ! ?  6.55684998e-05                 knstats=1,391,4,64,4
4  ! ! !    ! ! !     0.203119993            knstats=220,391,303,64,55
5  ! ! !      ! !   0.00481862016            knstats=16,391,957,64,115
6  ! ! !        !    0.0274260994           knstats=28,391,5659,64,932
7  ! ! !  " ! ! !  7.99940026e-05                 knstats=2,391,2,64,1
8  ! ! !      " !  1.51188997e-05               knstats=1,391,37,64,13
9  ! ! !        "  8.50678989e-05  knstats=2,391,1.11721e+06,64,180642
2个回答

47
您可以这样合并它们:
s1 = pd.merge(dfA, dfB, how='inner', on=['S', 'T'])

为了删除 NA 行:
s1.dropna(inplace=True)

2
我不仅仅是想合并它们,而是要取交集。也就是说,如果有一行中'S'和'T'没有同时具有prob和knstats,我想要把那一行去掉。你会注意到dfA和dfB并不完全匹配。然而,这似乎是一个很好的第一步。如何在输出矩阵中修剪具有NaN值的prob或knstats的行? - Bib
更改为 how='inner',这将基于 'S' 和 'T' 计算交集。 - user308827
另外,您可以使用dropna删除任何NaN的行。我已编辑了我的答案。 - user308827
7
这是一个并集,而非交集。 - lfk
1
根据定义:交集 == 所有列的等值连接 - user__42

1

要从两个数据框中选择S和T值相交的行,可以使用Index.intersection()。其思想是在两个数据框的S和T列中找到公共行(即交集),并仅选择这些行。

# convert S and T columns into MultiIndex
dfA_idx = pd.MultiIndex.from_frame(dfA[['S', 'T']])
dfB_idx = pd.MultiIndex.from_frame(dfB[['S', 'T']])
# get intersecting rows in S and T
common_idx = dfA_idx.intersection(dfB_idx)
# filter rows where S and T intersect
dfA_common = dfA.set_index(['S', 'T']).reindex(common_idx).reset_index()
dfB_common = dfB.set_index(['S', 'T']).reindex(common_idx).reset_index()

这些帧的串联将产生与merge()相同的结果,即。

x = dfA_common.join(dfB_common[['knstats']])
y = dfA.merge(dfB, on=['S', 'T'])
x.equals(y)                                    # True

result


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接