检查两列之间的一对一关系

时间:2018-12-08 21:36:53

标签: python pandas dataframe

我在熊猫数据框中有两列A和B,其中值重复多次。对于A中的唯一值,预计B也将具有“另一个”唯一值。 A的每个唯一值在B中都有一个对应的唯一值(请参见下面的示例,以两个列表的形式)。但是由于每列中的每个值都重复多次,因此我想检查两列之间是否存在一对一的关系。熊猫中是否有任何内置功能可以检查?如果不是,是否有一种有效的方法来完成该任务?

示例:

A = [1, 3, 3, 2, 1, 2, 1, 1]
B = [5, 12, 12, 10, 5, 10, 5, 5]

在这里,对于A中的每个1,B中的对应值始终为5,仅此而已。同样,对于2-> 10,对于3-> 12。因此,A中的每个数字在B中只有一个/唯一的对应数字(而没有其他数字)。我称这种一对一的关系。现在,我要检查熊猫数据框中的两列之间是否存在这种关系。

不满足此关系的示例:

A = [1, 3, 3, 2, 1, 2, 1, 1]
B = [5, 12, 12, 10, 5, 10, 7, 5]

在这里,A中的1在B中没有唯一的对应值。它具有两个对应的值-5和7。因此,不满足该关系。

1 个答案:

答案 0 :(得分:1)

考虑您有一些数据框:

 d = df({'A': [1, 3, 1, 2, 1, 3, 2], 'B': [4, 6, 4, 5, 4, 6, 5]})

d具有groupby方法,该方法返回GroupBy object。例如,这是用于按相等的列值对一些行进行分组的接口。

 gb = d.groupby('A')
 grouped_b_column = gb['B']

在分组的行上,您可以执行聚合。让我们在每个组中找到最小值和最大值。

res = grouped_b_column.agg([np.min, np.max])

>>> print(res)
   amin  amax
A            
1     4     4
2     5     5
3     6     6

现在我们只应该检查每个组中的aminamax是否相等,所以每个组都由相等的B字段组成:

res['amin'].equals(res['amax'])

如果此检查正常,则对于每个A,您都有唯一的B。现在,您应该为交换的AB列检查相同的条件。