我有两个不同的数据集a和b。我想将 b 左连接到 a,但我想连接到 a,其中只有 左连接 b['ColA'] 和 b['ColC'] 才能匹配 a['ColA'] 和 a['ColC'] ==1
类似 expected_table = pd.merge(a,b, left_on=['ColA', ['ColC']==1 ] ,rigth_on = ['ColA',['ColC']==0 ])
a = pd.DataFrame({"ColA":["num 1", "num 2", "num 3"],
"ColB":[5,6,7],
"ColC":[1,1,0]})
b = pd.DataFrame({"ColA":["num 1", "num 2", "num 4"],
"Colx":[10,16,71],
"Coly":[0,0,0]})
Coly
全部等于 0
expected= pd.DataFrame({"ColA":["num 1", "num 2", "num 3"],
"ColB":[5,6,7],
"ColC":[1,1,0],
"Colx":[10,16,None]})```
我通过在 b 表上创建一个与 a['colx']
匹配相同值的新列来解决这个问题。
但是我想知道是否有一种方法可以让你在合并/连接过程中使用条件,就像在sql中一样。
最佳答案
Pandas 中没有像 sql 那样在合并/连接过程中直接使用条件的功能。无论如何,我们可以通过链接 Pandas .merge()
来模拟这一点函数并按 .query()
执行过滤它的语法类似于 sql where 条件语法。
为此,您可以在匹配的 ColA
上对 a
和 b
进行左连接,并设置 indicator=True
让我们区分合并的行条目是仅来自 a
还是合并了 a
和 b
。
然后,使用 .query()
根据所需条件进行过滤,如果从两者合并,则 ColC == 1
和 Coly == 0
。否则,如果仅来自 a
,我们将保留该行。
df_out = (pd.merge(a, b, left_on='ColA', right_on ='ColA', how='left', indicator=True)
.query('(_merge == "left_only") | ((ColC == 1) & (Coly == 0))')
)
结果:
print(df_out)
ColA ColB ColC Colx Coly _merge
0 num 1 5 1 10.0 0.0 both
1 num 2 6 1 16.0 0.0 both
2 num 3 7 0 NaN NaN left_only
然后,我们可以通过 .drop
删除不需要的列,如下:
df_out = df_out.drop(['Coly', '_merge'], axis=1)
结果:
print(df_out)
ColA ColB ColC Colx
0 num 1 5 1 10.0
1 num 2 6 1 16.0
2 num 3 7 0 NaN
关于Python如何将Pandas数据帧与来自不同数据帧的特定值的匹配列连接/合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69394872/