"索引匹配" Excel中的功能没有在pandas Merge中捕获(或者是吗?)

时间:2016-01-10 01:31:01

标签: python excel pandas merge vlookup

有很多帖子在使用合并复制pandas中的Excel索引匹配功能,但合并似乎并没有涵盖Excel的索引匹配的最基本功能之一。

我有一个可行的解决方法,但我确信这是一个更好的方法。当然,我可能会遗漏一些关于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

我们要在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表。但考虑到大熊猫的其余部分是多么周到和全面,以及人们在Excel中做这种事情的频率,我发现很难相信在熊猫中这种输出没有更直接的途径,无论是合并的一部分或其他。

感谢您阅读本文。

1 个答案:

答案 0 :(得分:5)

嗯,一个人的责任是另一个人的特征。如果合并扔掉记录会很糟糕。在进行实质性操作之前清理数据。您正在进行连接操作,并且由于至少在显示的变量中存在重复项(可能存在更多不同的变量),因此连接遵循该变量。此外,您实际上正在执行从字母到目标的值映射。但为了使其有意义,您再次需要唯一的键:值对以避免歧义。

但是,映射可以轻松完成。

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

这实际上产生了一个表现良好的字典:

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

然后,您可以使用此功能将target映射到letters中的t1

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

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