如何提取数据框中另一个行中不存在的行

发布于 2021-01-29 17:31:41

我有两个数据框:

all_data:

              AID       VID  Freq
0        00016A3E  0127C661     1
1        00016A3E  0C05DA5D     2
2        00016A3E  0C032814     1
3        00016A3E  0BF6C78D     1
4        00016A3E  0A79DFF1     1
5        00016A3E  07BD2FB2     1
6        00016A3E  0790E61B     1
7        00016A3E  0C24ED25     3
8        00016A3E  073630B5     3
9        00016A3E  06613535     1
10       00016A3E  05F809AF     1
11       00016A3E  05C625FF     1
12       00016A3E  04220EA8     4
13       00016A3E  013A29E5     1
14       00016A3E  0761C98A     1
15       00016AE9  0A769475    16
16       00016AE9  0A7DED0A     2
17       00016AE9  0ABF60DF     9
18       00016AE9  0AE3F25A     2
19       00016AE9  0AEFE12F     5
20       00016AE9  0BD8975A     2
21       00016AE9  44DF880B     1
22       00016AE9  43F9E08E     2
23       00016AE9  44EA5E08     2
24       00016AE9  4539ED1E    16
25       00016AE9  8516B55A     4
26       00016AE9  0972AFF2     1
27       00016AE9  0C559B34     1
28       00016AE9  06B5C040     7
29       00016AE9  0B0426FA     1

子集:

             AID       VID  Freq
0       00016A3E  0C24ED25     3
1       00016A3E  0C05DA5D     2
2       00016AE9  0B0426FA     1
3       00016AE9  0AEFE12F     5

我需要创建第三个数据框,其中包含all_data不存在的所有行subset。请注意,中的所有行都subset存在于中all_data

因此,在这种情况下,新的df应该是:

              AID       VID  Freq
0        00016A3E  0127C661     1
2        00016A3E  0C032814     1
3        00016A3E  0BF6C78D     1
4        00016A3E  0A79DFF1     1
5        00016A3E  07BD2FB2     1
6        00016A3E  0790E61B     1
8        00016A3E  073630B5     3
9        00016A3E  06613535     1
10       00016A3E  05F809AF     1
11       00016A3E  05C625FF     1
12       00016A3E  04220EA8     4
13       00016A3E  013A29E5     1
14       00016A3E  0761C98A     1
15       00016AE9  0A769475    16
16       00016AE9  0A7DED0A     2
17       00016AE9  0ABF60DF     9
18       00016AE9  0AE3F25A     2
20       00016AE9  0BD8975A     2
21       00016AE9  44DF880B     1
22       00016AE9  43F9E08E     2
23       00016AE9  44EA5E08     2
24       00016AE9  4539ED1E    16
25       00016AE9  8516B55A     4
26       00016AE9  0972AFF2     1
27       00016AE9  0C559B34     1
28       00016AE9  06B5C040     7

我尝试了这里描述的方法:pandas获得的行不在其他数据框中,但由于每个数据框中的索引不匹配,它们无法工作。

关注者
0
被浏览
90
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以将merge(…,how =’left’,indicator = True)query()方法一起使用:

    In [38]: pd.merge(all_data, subset, how='left', indicator=True) \
               .query("_merge == 'left_only'") \
               .drop('_merge',1)
    Out[38]:
             AID       VID  Freq
    0   00016A3E  0127C661     1
    2   00016A3E  0C032814     1
    3   00016A3E  0BF6C78D     1
    4   00016A3E  0A79DFF1     1
    5   00016A3E  07BD2FB2     1
    6   00016A3E  0790E61B     1
    8   00016A3E  073630B5     3
    9   00016A3E  06613535     1
    10  00016A3E  05F809AF     1
    11  00016A3E  05C625FF     1
    12  00016A3E  04220EA8     4
    13  00016A3E  013A29E5     1
    14  00016A3E  0761C98A     1
    15  00016AE9  0A769475    16
    16  00016AE9  0A7DED0A     2
    17  00016AE9  0ABF60DF     9
    18  00016AE9  0AE3F25A     2
    20  00016AE9  0BD8975A     2
    21  00016AE9  44DF880B     1
    22  00016AE9  43F9E08E     2
    23  00016AE9  44EA5E08     2
    24  00016AE9  4539ED1E    16
    25  00016AE9  8516B55A     4
    26  00016AE9  0972AFF2     1
    27  00016AE9  0C559B34     1
    28  00016AE9  06B5C040     7
    

    一步步:

    In [39]: pd.merge(all_data, subset, how='left', indicator=True)
    Out[39]:
             AID       VID  Freq     _merge
    0   00016A3E  0127C661     1  left_only
    1   00016A3E  0C05DA5D     2       both
    2   00016A3E  0C032814     1  left_only
    3   00016A3E  0BF6C78D     1  left_only
    4   00016A3E  0A79DFF1     1  left_only
    5   00016A3E  07BD2FB2     1  left_only
    6   00016A3E  0790E61B     1  left_only
    7   00016A3E  0C24ED25     3       both
    8   00016A3E  073630B5     3  left_only
    9   00016A3E  06613535     1  left_only
    10  00016A3E  05F809AF     1  left_only
    11  00016A3E  05C625FF     1  left_only
    12  00016A3E  04220EA8     4  left_only
    13  00016A3E  013A29E5     1  left_only
    14  00016A3E  0761C98A     1  left_only
    15  00016AE9  0A769475    16  left_only
    16  00016AE9  0A7DED0A     2  left_only
    17  00016AE9  0ABF60DF     9  left_only
    18  00016AE9  0AE3F25A     2  left_only
    19  00016AE9  0AEFE12F     5       both
    20  00016AE9  0BD8975A     2  left_only
    21  00016AE9  44DF880B     1  left_only
    22  00016AE9  43F9E08E     2  left_only
    23  00016AE9  44EA5E08     2  left_only
    24  00016AE9  4539ED1E    16  left_only
    25  00016AE9  8516B55A     4  left_only
    26  00016AE9  0972AFF2     1  left_only
    27  00016AE9  0C559B34     1  left_only
    28  00016AE9  06B5C040     7  left_only
    29  00016AE9  0B0426FA     1       both
    
    In [40]: pd.merge(all_data, subset, how='left', indicator=True).query("_merge == 'left_only'")
    Out[40]:
             AID       VID  Freq     _merge
    0   00016A3E  0127C661     1  left_only
    2   00016A3E  0C032814     1  left_only
    3   00016A3E  0BF6C78D     1  left_only
    4   00016A3E  0A79DFF1     1  left_only
    5   00016A3E  07BD2FB2     1  left_only
    6   00016A3E  0790E61B     1  left_only
    8   00016A3E  073630B5     3  left_only
    9   00016A3E  06613535     1  left_only
    10  00016A3E  05F809AF     1  left_only
    11  00016A3E  05C625FF     1  left_only
    12  00016A3E  04220EA8     4  left_only
    13  00016A3E  013A29E5     1  left_only
    14  00016A3E  0761C98A     1  left_only
    15  00016AE9  0A769475    16  left_only
    16  00016AE9  0A7DED0A     2  left_only
    17  00016AE9  0ABF60DF     9  left_only
    18  00016AE9  0AE3F25A     2  left_only
    20  00016AE9  0BD8975A     2  left_only
    21  00016AE9  44DF880B     1  left_only
    22  00016AE9  43F9E08E     2  left_only
    23  00016AE9  44EA5E08     2  left_only
    24  00016AE9  4539ED1E    16  left_only
    25  00016AE9  8516B55A     4  left_only
    26  00016AE9  0972AFF2     1  left_only
    27  00016AE9  0C559B34     1  left_only
    28  00016AE9  06B5C040     7  left_only
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看