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横向连接)

17、pandas的merge合并函数

实战讲解pandas中merge, join, concat的区别

Pandas Left Merge with xlsx with CSV 在输出中产生空值列

pandas - DataFrame 写入同一张excel表

python pandas to_excel 高级玩法