"Index Match" Excel 中的功能未在 pandas 合并中捕获(或者是?)

"Index Match" functionality in Excel not captured in pandas Merge (or is it?)

有几篇关于使用合并在 pandas 中复制 Excel 的索引匹配功能的帖子,但合并似乎没有涵盖 [=40= 的最基本功能之一]的索引匹配。

我有一个可行的解决方法,但我确信还有更好的方法。当然,我可能遗漏了一些关于 pandas.merge.

的明显信息

假设我们有以下两个 tables

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

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

    numbers letters target
0   1623    a   ddd
1   3266    b   eee
2   3672    c   fff  

对于 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

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

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

t2_unique = t2[t2.target.duplicated==False]
t1.merge(t2_unique)

这会产生上面所需的 3x3 table。但考虑到 pandas 的其余部分是多么周到和全面,以及人们在 Excel 中做这种事情的频率有多高,我很难相信没有更直接的途径可以做到这一点pandas 中的输出,作为合并的一部分或其他。

感谢阅读本文。

嗯,一个人的责任是另一个人的特点。如果 merge 丢弃了记录,那就太糟糕了。在进行实质性操作之前清理数据。您正在执行连接操作,并且由于至少在显示的变量中存在重复项(可能有更多不同的变量),连接尊重这一点。此外,您实际上是在将值从字母映射到目标。但是为了使这有意义,您再次需要唯一的 key:value 对以避免歧义。

虽然映射很容易完成。

t2.set_index('letters',inplace=True)
t2_map = t2.target.to_dict()

这实际上产生了一个 well-behaved 字典:

{'a': 'ddd', 'b': 'eee', 'c': 'fff'}

然后您可以使用它来将 target 映射到 t1 中的 letters

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

      numbers letters target
0     1623       a    ddd
1     3266       b    eee
2     3672       c    fff