我在熊猫数据框中有两列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。因此,不满足该关系。
答案 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
现在我们只应该检查每个组中的amin
和amax
是否相等,所以每个组都由相等的B
字段组成:
res['amin'].equals(res['amax'])
如果此检查正常,则对于每个A
,您都有唯一的B
。现在,您应该为交换的A
和B
列检查相同的条件。