同事们,在分析这个问题的时候,我遇到了一些pandas.merge我完全无法理解逻辑的行为。我将不胜感激我的同事们的解释。即使是一些文档的链接也足够了。
给定。
有两个数据框由一列组成,我们试图通过这一列合并它们。
import pandas as pd
dic = {'col':['1','2','3','4','5','6','7','8','9']}
dic_1 = {'col':['9','8','7','6','5','4','3','2','1']}
df_1 = pd.DataFrame.from_dict(dic)
df_2 = pd.DataFrame.from_dict(dic_1)
df_total = pd.merge(df_1, df_2, on='col', how='inner')
print(df_1)
print(df_2)
print(df_total)
如果至少一个数据帧中的值不重复,则一切都很好且符合逻辑
col
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
但问题是这样的。
如果相同的值在两个数据帧中重复,则生成的数据帧将包含该值 m*n 次,其中 m 和 n 分别是第一个和第二个数据帧中该值的重复次数:
import pandas as pd
dic = {'col':['1','2','3','3','3','6','7','8','9']}
dic_1 = {'col':['9','8','7','6','5','3','3','2','1']}
df_1 = pd.DataFrame.from_dict(dic)
df_2 = pd.DataFrame.from_dict(dic_1)
df_total = pd.merge(df_1, df_2, on='col', how='inner')
print(df_1)
print(df_2)
print(df_total)
结果如下:
col
0 1
1 2
2 3
3 3
4 3
5 3
6 3
7 3
8 6
9 7
10 8
11 9
所有结果都是凭经验获得的,我只能对逻辑做出假设。
我将不胜感激的解释。
这种情况是多对多合并 - 左键和右键都是重复的以进行合并 - 并且与“内部”和“外部”、“左”和“右”相关。在这种情况下,合并的选择是什么?
这就是为什么它会这样工作,你只需要考虑到它。
如果不发生这种“复制”对您来说至关重要,您可以使用
validate指定有效合并选项的参数,例如“many_to_one” - 那么“many_to_many”选项将发生异常。好吧,或者在合并之前检查帧以确定键的唯一性。添加。信息。(英语)
可以添加一列标识符,一目了然
inside 与如何处理重复项无关,它是关于“将左侧的每个关键元素与右侧的每个关键元素进行匹配并打印这些元素匹配的行”。如果键重复,那么每个重复的键都会参与比较,因此是“复制”。如果您希望不存在重复项,请在合并之前或之后自行处理它们。