【问题标题】:Check one-on-one relationship between two columns检查两列之间的一对一关系
【发布时间】:2018-12-09 09:47:43
【问题描述】:

我在 pandas 数据框中有两列 A 和 B,其中的值重复了多次。对于 A 中的唯一值,B 也应该具有“另一个”唯一值。并且 A 的每个唯一值在 B 中都有一个对应的唯一值(参见下面两个列表形式的示例)。但是由于每列中的每个值都重复多次,所以我想检查两列之间是否存在任何一对一的关系。 pandas 中是否有任何内置功能可以检查?如果没有,是否有实现该任务的有效方法?

例子:

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。因此,不满足关系。

【问题讨论】:

  • 请提供样本数据。
  • 向我们展示一个小样本数据框以及您期望从解决方案中获得的输出。
  • 现已提供示例(实际上是解释性示例)。

标签: python pandas dataframe


【解决方案1】:

假设你有一些数据框:

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

dgroupby 方法,它返回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 列的相同条件。

【讨论】:

  • 这回答了我的问题。谢谢!
  • 如果您有 None 值,请小心。该行为可能不是您想要的行为。例如,它为pd.DataFrame({'A': [1, 3, 1, 2, 1, 3, 2], 'B': [4, 6, None, 5, 4, 6, 5]})返回True
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
相关资源
最近更新 更多