在groupby中使用isin

2024-09-28 04:20:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧df1是:

    uid   a   b
0   111   i1   2
1   111   i2   3
2   111   i4   5
3   111   i6   7
4   111   i5   8
5   222   i10   9
6   222   i11  12
7   222   i13  11
8   222   i2   1
9   333   i14  16
10  333   i3   2
11  333   i16  19
12  333   i3   4
13  444   i21  20
14  444   i9   5

我的df2:

    uid   a   
0   111   i1   
1   111   i2   
2   222   i4   
3   222   i11  
4   222   i13  
5   222   i2   

我想通过uid检查df2.a是否在df1.a组中,如果它存在,那么我想创建列"new",并将1放入该列中

我的预期输出是:

    uid   a   b.  new 
0   111   i1   2.  1
1   111   i2   3.  1
2   111   i4   5   0
3   111   i6   7.  0
4   111   i5   8.  0
5   222   i10   9. 0
6   222   i11  12. 1
7   222   i13  11. 1
8   222   i2   1.  0
9   333   i14  16. 0
10  333   i3   2.  0
11  333   i16  19. 0
12  333   i3   4.  0
13  444   i21  20. 0
14  444   i9   5.  0

请问有人知道怎么做吗


Tags: uiddf1i3i1i5i4i2i6
3条回答

让我们做assign

out = df1.merge(df2.assign(new=1),how='left').fillna({'new':0})
Out[255]: 
    uid    a   b  new
0   111   i1   2  1.0
1   111   i2   3  1.0
2   111   i4   5  0.0
3   111   i6   7  0.0
4   111   i5   8  0.0
5   222  i10   9  0.0
6   222  i11  12  1.0
7   222  i13  11  1.0
8   222   i2   1  1.0
9   333  i14  16  0.0
10  333   i3   2  0.0
11  333  i16  19  0.0
12  333   i3   4  0.0
13  444  i21  20  0.0
14  444   i9   5  0.0

尝试使用左^{}和指示符,然后根据两个表中的值将指示符替换为10,类似于^{}

new_df = pd.merge(df1, df2, on=['uid', 'a'], how='left', indicator='new')
new_df['new'] = np.where(new_df['new'].eq('both'), 1, 0)

选项2:使用^{}+^{}获取布尔值:

new_df = pd.merge(df1, df2, on=['uid', 'a'], how='left', indicator='new')
new_df['new'] = new_df['new'].eq('both').astype(int)

new_df

    uid    a   b  new
0   111   i1   2    1
1   111   i2   3    1
2   111   i4   5    0
3   111   i6   7    0
4   111   i5   8    0
5   222  i10   9    0
6   222  i11  12    1
7   222  i13  11    1
8   222   i2   1    1
9   333  i14  16    0
10  333   i3   2    0
11  333  i16  19    0
12  333   i3   4    0
13  444  i21  20    0
14  444   i9   5    0

使用set_index()isin()并将结果显示为整数:

df1['new'] = (df1.set_index(['uid', 'a']).index
                 .isin(df2.set_index(['uid', 'a']).index)
                 .astype(int)
             )

输出:

    uid    a     b  new
0   111   i1     2    1
1   111   i2     3    1
2   111   i4     5    0
3   111   i6     7    0
4   111   i5     8    0
5   222  i10     9    0
6   222  i11    12    1
7   222  i13    11    1
8   222   i2     1    1
9   333  i14    16    0
10  333   i3     2    0
11  333  i16    19    0
12  333   i3     4    0
13  444  i21    20    0
14  444   i9     5    0

相关问题 更多 >

    热门问题