未在Pandas Merge中捕获Excel中的“索引匹配”功能(是吗?)

pea*_*ark 3 python excel merge vlookup pandas

关于使用合并在熊猫中复制Excel的Index-Match功能的文章有好几篇,但是合并似乎并没有涵盖Excel的Index-Match的最基本功能之一。

我有一个可行的解决方法,但是我敢肯定有更好的方法。当然,我可能会缺少有关pandas.merge的明显信息。

假设我们有以下两个表格

t1
    numbers letters
0   1623    a
1   3266    b
2   3672    c

t2
    letters target
0   a   ddd
1   a   ddd
2   a   ddd
3   b   eee
4   b   eee
5   b   eee
6   c   fff
7   c   fff
8   c   fff
Run Code Online (Sandbox Code Playgroud)

并且我们想向t1添加一列,该列根据t2.letters中的值简单地映射t2.target中的值以产生以下结果:

    numbers letters target
0   1623    a   ddd
1   3266    b   eee
2   3672    c   fff  
Run Code Online (Sandbox Code Playgroud)

使用pandas.merge,似乎t2.target中的所有重复值都必须显示在结果DataFrame中,如下所示:

    numbers letters target
0   1623    a   ddd
1   1623    a   ddd
2   1623    a   ddd
3   3266    b   eee
4   3266    b   eee
5   3266    b   eee
6   3672    c   fff
7   3672    c   fff
8   3672    c   fff
Run Code Online (Sandbox Code Playgroud)

但是,在许多情况下,这不是我们想要的。

一种解决方法是使用.duplicated():

t2_unique = t2[t2.target.duplicated==False]
t1.merge(t2_unique)
Run Code Online (Sandbox Code Playgroud)

这将产生上面所需的3x3表格。但是,鉴于其余大熊猫的思想和全面性以及人们在Excel中执行此类操作的频率,我很难相信,在大熊猫中,没有比这更直接的途径来实现这种输出合并或其他内容。

感谢您阅读本文。

ako*_*ako 5

好吧,一个人的责任是另一个人的特征。如果合并丢弃记录,那将是不好的。在进行实质性操作之前,请先清理数据。您正在执行联接操作,并且由于至少在显示的thee变量中存在重复项(可能存在更多不同的变量),因此联接会遵守该要求。另外,您实际上是在将值从字母映射到目标。但是,要使此有意义,您再次需要唯一的key:value对,以避免歧义。

不过,映射可以轻松完成。

t2.set_index('letters',inplace=True)
t2_map = t2.target.to_dict()
Run Code Online (Sandbox Code Playgroud)

这实际上产生了一个行为良好的字典:

{'a': 'ddd', 'b': 'eee', 'c': 'fff'}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用它来映射targetletters中的t1

t1['target']=t1.letters.map(t2_map)
t1

      numbers letters target
0     1623       a    ddd
1     3266       b    eee
2     3672       c    fff
Run Code Online (Sandbox Code Playgroud)