查看熊猫中两栏是否一对一的简便方法

use*_*076 2 python one-to-one pandas

在Python 3+中使用Pandas处理数据。似乎应该有一种简单的方法来检查两个列是否具有一对一的关系(无论列类型如何),但是我一直在努力寻找实现此目的的最佳方法。

预期输出示例:

A    B     C
0    'a'   'apple'
1    'b'   'banana'
2    'c'   'apple'
Run Code Online (Sandbox Code Playgroud)

A和B是一对一的吗?真正

A和C是一对一的吗?假

B&C是一对一的吗?假

zip*_*ipa 5

好了,您可以创建自己的函数进行检查:

def isOneToOne(df, col1, col2):
    first = df.groupby(col1)[col2].count().max()
    second = df.groupby(col2)[col1].count().max()
    return first + second == 2

isOneToOne(df, 'A', 'B')
#True
isOneToOne(df, 'A', 'C')
#False
isOneToOne(df, 'B', 'C')
#False
Run Code Online (Sandbox Code Playgroud)

如果您的数据更像这样:

df = pd.DataFrame({'A': [0, 1, 2, 0],
                   'C': ["'apple'", "'banana'", "'apple'", "'apple'"],
                   'B': ["'a'", "'b'", "'c'", "'a'"]})
df
#   A    B         C
#0  0  'a'   'apple'
#1  1  'b'  'banana'
#2  2  'c'   'apple'
#3  0  'a'   'apple'
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用:

def isOneToOne(df, col1, col2):
    first = df.drop_duplicates([col1, col2]).groupby(col1)[col2].count().max()
    second = df.drop_duplicates([col1, col2]).groupby(col2)[col1].count().max()
    return first + second == 2
Run Code Online (Sandbox Code Playgroud)


小智 5

df.groupby(col1)[col2]\
  .apply(lambda x: x.nunique() == 1)\
  .all()
Run Code Online (Sandbox Code Playgroud)

如果您想要正确或错误的答案,应该可以正常工作。

使用离散/分类值(如果您使用 Jupyter notebook)可视化两列之间关系的一种好方法是:

df.groupby([col1, col2])\
  .apply(lambda x : x.count())\
  .iloc[:,0]\
  .unstack()\
  .fillna(0)
Run Code Online (Sandbox Code Playgroud)

这个矩阵会告诉你两列中列值之间的对应关系。

在一对一关系的情况下,矩阵中的每一行将只有一个非零值。


小智 5

df.groupby('A').B.nunique().max()==1 #Output: True

df.groupby('B').C.nunique().max()==1 #Output: False
Run Code Online (Sandbox Code Playgroud)

在 [groupby 列] 中的每个值中,计算 [其他列] 中唯一值的数量,然后检查所有此类计数的最大值是否为 1