Excel中的“索引匹配”function不能在pandas合并(或是否?

在使用合并复制pandas中的Excel索引匹配function方面有几个post,但合并似乎没有涵盖Excel索引匹配的最基本function之一。

我有一个可以通过的解决方法,但我相信有一个更好的方法。 当然,我可能会错过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) 

这产生了上面所需的3×3表格。 但是考虑到其余的pandas有多么周到和全面,以及人们在Excel中做这种事情的频率如何,我发现很难相信在pandas这种产出没有更直接的path,或者作为一部分合并或其他的东西。

感谢您阅读此。

那么,一个人的责任是另一个人的特征。 合并扔掉logging会很糟糕。 在进行实质性操作之前清理您的数据。 你正在做一个连接操作,并且由于至less在所显示的variables中有重复(可能有更多的variables是不同的),所以连接尊重这一点。 另外,你真的在​​做一个从字母到目标值的映射。 但是,为了使其有意义,您需要使用独特的关键字:值对来避免歧义。

虽然,映射可以很容易地完成。

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

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

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

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

 t1['target']=t1.letters.map(t2_map) t1 numbers letters target 0 1623 a ddd 1 3266 b eee 2 3672 c fff