# 实例5.1:validate检查重复键
    
left = pd.DataFrame({'A' : [11,12], 'B' : [13, 13]})           #B列重复数字
right = pd.DataFrame({'A' : [14,15,16], 'B': [13,13,13]})      #B列重复数字
left1 = pd.DataFrame({'A' : [11,12], 'B' : [13, 14]})          #B列无重复数字
right1 = pd.DataFrame({'A' : [14,15,16], 'B': [17,18,19]})     #B列无重复数字
left2 = pd.DataFrame({'A' : [11,12], 'B' : [13, 14]})          #B列无重复数字
right2 = pd.DataFrame({'A' : [14,15,16], 'B': [13,13,13]})     #B列重复数字
    
result=pd.merge(left, right, on='B', how='outer')              #结果等价下面
result=pd.merge(left, right, on='B', how='outer', validate="m:m")
result1=pd.merge(left1, right1, on='B', how='outer')
result0 = pd.merge(left, right, on='B', how='outer',
                             validate="one_to_one")  #错误:左侧和右侧B列都有重复值不是一对一合并
result2=pd.merge(left2, right2, on='B', how='outer',
                             validate="one_to_many") #左侧B列无重复值,右侧B列有重复值1:m
    
# left           left1            left2
    A   B            A   B            A   B
0  11  13        0  11  13        0  11  13
1  12  13        1  12  14        1  12  14
                
# right          right1           right2
      A   B          A   B            A   B
0  14  13        0  14  17        0  14  13
1  15  13        1  15  18        1  15  13
2  16  13        2  16  19        2  16  13
    
# result               result1对比组            result2 1:m
   A_x   B  A_y            A_x   B   A_y           A_x   B   A_y
0   11  13   14        0  11.0  13   NaN        0   11  13  14.0
1   11  13   15        1  12.0  14   NaN        1   11  13  15.0
2   11  13   16        2   NaN  17  14.0        2   11  13  16.0
3   12  13   14        3   NaN  18  15.0        3   12  14   NaN
4   12  13   15        4   NaN  19  16.0
5   12  13   16
    
#result1在列上有重复值导致返回数据数量是行维度的乘法,易导致内存溢出;
#在合并前应考虑重复值问题
    
# 实例5.2:正确应用 - 指定唯一值
left = pd.DataFrame({'no':[11,12,13],'name' : ['Tom','Jim','Jim'], 'age' : [13, 13,14]})
right = pd.DataFrame({'no' : [11,12,13], 'weight': [30,40,40]})
pd.merge(left, right, on='B', how='outer', validate="1:1")#no为唯一值
    
    no name  age  weight
0  11  Tom   13      30
1  12  Jim   13      40
2  13  Jim   14      40

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐