Pandas Merge 中未捕获 Excel 中的“索引匹配”功能(或者是吗?)
Posted
技术标签:
【中文标题】Pandas Merge 中未捕获 Excel 中的“索引匹配”功能(或者是吗?)【英文标题】:"Index Match" functionality in Excel not captured in pandas Merge (or is it?) 【发布时间】:2016-04-14 13:14:06 【问题描述】:有几篇文章介绍了使用合并在 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 表格。但是考虑到 pandas 的其他部分是多么周到和全面,以及人们在 Excel 中做这种事情的频率,我很难相信在 pandas 中没有更直接的途径来实现这种输出,或者作为一部分合并或其他。
感谢您阅读本文。
【问题讨论】:
【参考方案1】:嗯,一个人的责任是另一个人的特征。如果合并丢弃记录会很糟糕。在进行实质性操作之前清理您的数据。您正在执行联接操作,并且由于至少在显示的变量中存在重复项(可能有更多不同的变量),因此联接尊重这一点。此外,您实际上是在进行从字母到目标的值的映射。但是为了使这有意义,您再次需要唯一的键:值对以避免歧义。
不过,映射可以轻松完成。
t2.set_index('letters',inplace=True)
t2_map = t2.target.to_dict()
这实际上产生了一个表现良好的字典:
'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
【讨论】:
谢谢!我知道必须有更明确的路线。以上是关于Pandas Merge 中未捕获 Excel 中的“索引匹配”功能(或者是吗?)的主要内容,如果未能解决你的问题,请参考以下文章
python数据分析(12)Pandas实现对Excel列表数据整合(merge纵向合并concat横向连接)
实战讲解pandas中merge, join, concat的区别
Pandas Left Merge with xlsx with CSV 在输出中产生空值列