如何执行左连接并忽略默认值?

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

表 df1(Pandas 数据框):

      id1    type    cat
0       1       a      0
1       1       b      0
2       2       a      8
3       2       a      9

表 df2:

      id2    type    cat
0       0       a      8
1       0       a      9
2       1       a      8
3       1       a      9
4       2       a      8
5       3       a      9
6       4       b      7
7       5       b      8

我正在执行左连接:

merged = pd.merge(df1, df2, how='left')

我再次使用 Pandas 执行此操作,但我可以使用 SQL,我得到:

      id1    type    cat     id2
0       1       a      0     NaN
1       1       b      0     NaN
2       2       a      8     0.0
3       2       a      8     1.0
4       2       a      8     2.0
5       2       a      9     0.0
6       2       a      9     1.0
7       2       a      9     3.0

不过,我想要的是将 df1 的

0
列中的
cat
视为通配符,就像它包含所有类别一样。它没有表达式,因此应从合并中排除。

在此示例中,结果将包括 df2 中的所有行,因为只有

type
列必须匹配。

python sql pandas merge left-join
1个回答
1
投票

不确定是否有一个简单的解决方案,但你可以做的一件事是单独准备带有通配符连接的数据帧并在最后连接它们:

merged1 = pd.merge(df1[df1['cat']!=0, df2, how='left')
df1_tmp = df1[df1['cat']==0].drop('cat', axis=1)
df1_tmp['key'] = 0
df2['key'] = 0
merged2 = df1_tmp.merge(df2, on='key', how='outer')
merged = pd.concat(merged1, merged2)
© www.soinside.com 2019 - 2024. All rights reserved.