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