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是一对一的吗?假
好了,您可以创建自己的函数进行检查:
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