有很多帖子在使用合并复制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中做这种事情的频率,我发现很难相信在熊猫中这种输出没有更直接的途径,无论是合并的一部分或其他。
感谢您阅读本文。
答案 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