我想合并两个数据帧df1和df2,条件是如果key2中右侧的值不存在于key1中的左侧,则使用Alternative_Key.有没有办法以一种好的方式这样做呢?

a = {'key1': ['a','b','c'], 'alternative_key':['f','g','h']}
df1 = pd.DataFrame(data=a)


b = {'key2':['a','b','h'], 'some_stuff': [1,2,3]}
df2 = pd.DataFrame(data=b)

df_final=df1.merge(df2, left_on='key1', right_on='key2', how='left')

DF_FINAL中的预期结果:

  key1 alternative_key  some_stuff
0    a               f           1
1    b               g           2
2    c               h           3

推荐答案

按所需的优先级顺序执行合并和combine_first:

(df1.merge(df2, left_on='key1', right_on='key2', how='left')
    .combine_first(df1.merge(df2, left_on='alternative_key',
                             right_on='key2', how='left'))
    .drop(columns='key2')
)

编写代码的其他方法(使用变量):

merge1 = df1.merge(df2, left_on='key1', right_on='key2', how='left')
merge2 = df1.merge(df2, left_on='alternative_key', right_on='key2', how='left')

out = merge1.combine_first(merge2).drop(columns='key2')

输出:

  key1 alternative_key  some_stuff
0    a               f         1.0
1    b               g         2.0
2    c               h         3.0

NB. the advantage of this method is that you can have as many other columns as you want. All will be merged in order.

arbitrary number of alternative keys:

from functools import reduce

keys = ['key1', 'alternative_key']

out = (reduce(lambda a,b: a.combine_first(b),
              [df1.merge(df2, left_on=k, right_on='key2', how='left')
               for k in keys])
       .drop(columns='key2')
      )

Python相关问答推荐

Pandas数据帧处理Pandas表中Json内的嵌套列表以获取后续Numpy数组

如何将uint 16表示为float 16

如何在telegram 机器人中发送音频?

从单个列创建多个列并按pandas分组

在编写要Excel的数据透视框架时修复标题行

在Python中为变量的缺失值创建虚拟值

numba jitClass,记录类型为字符串

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

如何在polars(pythonapi)中解构嵌套 struct ?

Mistral模型为不同的输入文本生成相同的嵌入

使用setuptools pyproject.toml和自定义目录树构建PyPi包

海上重叠直方图

如何并行化/加速并行numba代码?

Geopandas未返回正确的缓冲区(单位:米)

为什么常规操作不以其就地对应操作为基础?

如何创建引用列表并分配值的Systemrame列

人口全部乱序 - Python—Matplotlib—映射

关于两个表达式的区别

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量