"Index Match" Excel 中的功能未在 pandas 合并中捕获(或者是?)
"Index Match" functionality in Excel not captured in pandas Merge (or is it?)
有几篇关于使用合并在 pandas 中复制 Excel 的索引匹配功能的帖子,但合并似乎没有涵盖 [=40= 的最基本功能之一]的索引匹配。
我有一个可行的解决方法,但我确信还有更好的方法。当然,我可能遗漏了一些关于 pandas.merge.
的明显信息
假设我们有以下两个 tables
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 table。但考虑到 pandas 的其余部分是多么周到和全面,以及人们在 Excel 中做这种事情的频率有多高,我很难相信没有更直接的途径可以做到这一点pandas 中的输出,作为合并的一部分或其他。
感谢阅读本文。
嗯,一个人的责任是另一个人的特点。如果 merge 丢弃了记录,那就太糟糕了。在进行实质性操作之前清理数据。您正在执行连接操作,并且由于至少在显示的变量中存在重复项(可能有更多不同的变量),连接尊重这一点。此外,您实际上是在将值从字母映射到目标。但是为了使这有意义,您再次需要唯一的 key:value 对以避免歧义。
虽然映射很容易完成。
t2.set_index('letters',inplace=True)
t2_map = t2.target.to_dict()
这实际上产生了一个 well-behaved 字典:
{'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 中复制 Excel 的索引匹配功能的帖子,但合并似乎没有涵盖 [=40= 的最基本功能之一]的索引匹配。
我有一个可行的解决方法,但我确信还有更好的方法。当然,我可能遗漏了一些关于 pandas.merge.
的明显信息假设我们有以下两个 tables
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 table。但考虑到 pandas 的其余部分是多么周到和全面,以及人们在 Excel 中做这种事情的频率有多高,我很难相信没有更直接的途径可以做到这一点pandas 中的输出,作为合并的一部分或其他。
感谢阅读本文。
嗯,一个人的责任是另一个人的特点。如果 merge 丢弃了记录,那就太糟糕了。在进行实质性操作之前清理数据。您正在执行连接操作,并且由于至少在显示的变量中存在重复项(可能有更多不同的变量),连接尊重这一点。此外,您实际上是在将值从字母映射到目标。但是为了使这有意义,您再次需要唯一的 key:value 对以避免歧义。
虽然映射很容易完成。
t2.set_index('letters',inplace=True)
t2_map = t2.target.to_dict()
这实际上产生了一个 well-behaved 字典:
{'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