很容易看出Pandas的两列是不是一个一个

2024-04-23 06:48:51 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python3+中的pandas处理数据。似乎应该有一个简单的方法来检查两个列是否有一对一的关系(不管列的类型如何),但是我正在努力想最好的方法。在

预期输出示例:

A    B     C
0    'a'   'apple'
1    'b'   'banana'
2    'c'   'apple'

A&B是一对一?是的

空调是一对一?假

B&C是一对一?假


Tags: 数据方法示例类型applepandas关系python3
3条回答
df.groupby(col1)[col2]\
  .apply(lambda x: x.nunique() == 1)\
  .all()

如果你想要一个正确或错误的答案,应该可以很好地工作。在

用离散/分类值可视化两列之间的关系的一个好方法是:

^{pr2}$

此矩阵将告诉您两列中列值之间的对应关系。在

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

解决这个问题的方法之一

df['A to B']=df.groupby('B')['A'].transform(lambda x:x.nunique()==1)
df['A to C']=df.groupby('C')['A'].transform(lambda x:x.nunique()==1)
df['B to C']=df.groupby('C')['B'].transform(lambda x:x.nunique()==1)

输出:

^{pr2}$

要逐列检查:

print (df['A to B']==True).all()
print (df['A to C']==True).all()
print (df['B to C']==True).all()

True
False
False

那么,您可以创建自己的函数来检查它:

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

如果您的数据更像这样:

^{pr2}$

然后您可以使用:

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

相关问题 更多 >