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

问题描述 投票:0回答:2

假设我有两个像这样的数据框:

>>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”条目的行以及来自

prob
dfA
列和来自
knstats
dfB
列组成.结果应如下所示,重要的是顺序相同:

       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
python pandas dataframe intersection
2个回答
45
投票

您可以合并它们:

s1 = pd.merge(dfA, dfB, how='inner', on=['S', 'T'])

删除 NA 行:

s1.dropna(inplace=True)

0
投票

要从 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

© www.soinside.com 2019 - 2024. All rights reserved.