【问题标题】:Determine if columns of a pandas dataframe uniquely identify the rows确定 pandas 数据框的列是否唯一标识行
【发布时间】:2023-03-06 08:34:01
【问题描述】:

我正在寻找一种方法来确定 pandas 数据帧的一列或一组列是否唯一标识该数据帧的行。我见过这个叫isid function in Stata.

我能想到的最好方法是使用集合推导获取列子集的唯一值,并断言集合中的值与数据框中的行数一样多:

subset = df[["colA", "colC"...]]
unique_vals = {tuple(x) for x in subset.values}
assert(len(unique_vals) == len(df))

这不是世界上最优雅的答案,所以我想知道是否有一个内置函数可以做到这一点,或者可能是一种测试列子集是否是唯一值索引的方法。

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

    您可以创建一个索引并检查其is_unique 属性:

    import pandas as pd
    
    df1 = pd.DataFrame([(1,2),(1,2)], columns=list('AB'))
    
    df2 = pd.DataFrame([(1,2),(1,3)], columns=list('AB'))
    
    print(df1.set_index(['A','B']).index.is_unique)
    # False
    
    print(df2.set_index(['A','B']).index.is_unique)
    # True
    

    【讨论】:

    • 嗯,我认为这可能会比使用重复的要慢,但在少数测试用例中,这总是更快(不是明显更快,但在我尝试的每种情况下都明显更快)
    【解决方案2】:

    也许groupbysize

    df.groupby(['x','y']).size()==1
    Out[308]: 
    x  y
    1  a     True
    2  b     True
    3  c     True
    4  d    False
    dtype: bool
    

    【讨论】:

    • 在末尾添加.all() 会给你一个简单的布尔值,告诉你列是否是索引。不错的答案!
    【解决方案3】:

    你可以检查

    df[['x', 'y']].transform(tuple,1).duplicated(keep=False).any()
    

    查看列xy 中的值集是否存在重复行。

    例子:

    df = pd.DataFrame({'x':[1,2,3,4,4], 'y': ["a", "b", "c", "d","d"]})
    
    
        x   y
    0   1   a
    1   2   b
    2   3   c
    3   4   d
    4   4   d
    

    然后transform

    0    (1, a)
    1    (2, b)
    2    (3, c)
    3    (4, d)
    4    (4, d)
    dtype: object
    

    然后检查哪些是duplicated()

    0    False
    1    False
    2    False
    3     True
    4     True
    dtype: bool
    

    注意transformingtuple 可能没有必要

    df.duplicated(keep=False)
    
    0    False
    1    False
    2    False
    3     True
    4     True
    dtype: bool
    

    【讨论】:

    • 更简单的方式(或至少更简洁)可能是(~df.duplicated()).all()
    猜你喜欢
    • 2021-09-15
    • 2019-07-08
    • 2019-07-12
    • 2023-01-18
    • 2010-09-16
    • 2012-11-18
    • 1970-01-01
    • 2018-03-04
    • 2020-10-01
    相关资源
    最近更新 更多