Python如何将Pandas数据帧与来自不同数据帧的特定值的匹配列连接/合并

标签 python pandas join merge conditional-statements

我有两个不同的数据集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 上对 ab 进行左连接,并设置 indicator=True 让我们区分合并的行条目是仅来自 a 还是合并了 ab

然后,使用 .query()根据所需条件进行过滤,如果从两者合并,则 ColC == 1Coly == 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/

相关文章:

python - concurrent.futures.ProcessPoolExecutor() python 中的共享变量

python - pd.ExcelWriter, writer.save(), 下载文件到本地

Python:如何分隔字符串中的字符和数字

python - 匹配 Excel 文件中的两列并获取其他列值 - Python Pandas

sql - MySQL - 从多个具有相同结构但不同数据的表中选择数据

python - Tweepy Streaming - 停止收集 x 数量的推文

Python数据框: Add element to multiple cells with condition

python - 使用 Pandas 对同一工作簿的多个工作表进行 pd.read_excel()

mysql - SQL从一个表中选择两次与单个表相关的字段

mysql - 查找具有相同列值的多行的 SQL 查询