在合并功能熊猫中验证

时间:2018-06-27 08:20:22

标签: python-3.x pandas validation merge

今天,我试图更深入地了解熊猫的“合并”功能,我发现了“验证”选项,如文档中所述,该选项可以是:

  

validate:字符串,默认为无

     

如果指定,则检查合并是否为指定类型。

     

“ one_to_one”或“ 1:1”:检查合并键在左侧和右侧是否唯一   正确的数据集。 “ one_to_many”或“ 1:m”:检查合并键是否唯一   在左数据集中。 “ many_to_one”或“ m:1”:检查合并键是否为   在正确的数据集中唯一。 “ many_to_many”或“ m:m”:允许,但是   不会导致检查。

我环顾四周,找到了在哪里以及如何使用此功能的有效示例,但找不到任何示例。而且,当我尝试将其应用于要合并的一组DataFrame时,它似乎并没有改变输出。 谁能给我一个可行的例子,以使我更好地理解它?

预先感谢

马提亚

1 个答案:

答案 0 :(得分:4)

如果验证失败,新的valdate参数将引发MergeError,例如:

df1 = pd.DataFrame({'a':list('aabc'),'b':np.random.randn(4)})
df2 = pd.DataFrame({'a':list('aabc'),'b':np.random.randn(4)})

print(df1)
print(df2)

   a         b
0  a -2.557152
1  a -0.145969
2  b -1.629560
3  c -0.233517

   a         b
0  a -0.352038
1  a  0.490438
2  b  0.319452
3  c -0.599481

现在,如果我们在'a'列上合并而没有validate

In[39]:
df1.merge(df2, on='a')

Out[39]: 
   a       b_x       b_y
0  a -2.557152 -0.352038
1  a -2.557152  0.490438
2  a -0.145969 -0.352038
3  a -0.145969  0.490438
4  b -1.629560  0.319452
5  c -0.233517 -0.599481

这可行,但是由于列“ b”不同,我们为“ a”获得了更多行,现在我们通过validate='1:1',我们得到了一个错误:

MergeError: Merge keys are not unique in either left or right dataset; not a one-to-one merge

如果我们通过validate='1:m',则会收到另一个错误:

MergeError: Merge keys are not unique in left dataset;not a one-to-many merge

如果我们通过'm:m',同样会使验证失败:

In[42]:
df1.merge(df2, on='a',validate='m:m')

Out[42]: 
   a       b_x       b_y
0  a -2.557152 -0.352038
1  a -2.557152  0.490438
2  a -0.145969 -0.352038
3  a -0.145969  0.490438
4  b -1.629560  0.319452
5  c -0.233517 -0.599481

没有错误发生,如果我们没有通过validate参数,我们将得到相同的合并df

api文档未提供示例,但what's new部分提供了示例,原始github enhancement也提供了更多背景信息