【问题标题】:Drop duplicates based on multiple columns基于多列删除重复项
【发布时间】:2021-11-03 16:46:05
【问题描述】:

我想创建一个子集,其中删除了具有 3 个或更多相同列的数据,但保留了原始数据。我有 4 列 ['col1', 'col2', 'col3', 'col4'],并写下一段代码:

df1 = data_between_all.drop_duplicates(['col1', 'col2', 'col3']).copy()
df2 = data_between_all.drop_duplicates(['col1', 'col3', 'col4']).copy()
df3 = data_between_all.drop_duplicates(['col1', 'col2', 'col4']).copy()
df4 = data_between_all.drop_duplicates(['col2', 'col3', 'col4']).copy()

data_without_duplicates = df1.append([df2, df3, df4]).drop_duplicates()

有没有最复杂的方法来做到这一点?

【问题讨论】:

    标签: python pandas dataframe filtering


    【解决方案1】:

    您可以使用一个简单的循环在每次迭代中排除一列:

    设置Minimal Reproducible Example

    df = pd.DataFrame(np.random.randint(0, 2, (10, 4)),
                      columns=['col1', 'col2', 'col3', 'col4'])
    print(df)
    

    样本数据:

    >>> df
       col1  col2  col3  col4
    0     1     1     1     1
    1     1     1     1     1
    2     0     0     0     1
    3     0     1     1     0
    4     1     0     0     0
    5     1     1     0     1
    6     0     0     1     0
    7     0     1     0     0
    8     0     0     0     0
    9     1     0     1     0
    
    data = []
    for col in df.columns:
        data.append(df.drop_duplicates(df.columns[df.columns != col]))
    out = pd.concat(data).drop_duplicates()
    

    输出结果:

    >>> out
       col1  col2  col3  col4
    0     1     1     1     1
    2     0     0     0     1
    3     0     1     1     0
    4     1     0     0     0
    5     1     1     0     1
    6     0     0     1     0
    7     0     1     0     0
    9     1     0     1     0
    

    【讨论】:

    • @Nachon。你有时间检查答案吗?
    【解决方案2】:

    您可以使用循环而不是拼出每个组合:

    # Generate random data
    cols = [f'col{i}' for i in range(1,5)]
    df = pd.DataFrame(np.random.randint(1, 10, (25, 4)), columns=cols)
    
    # Process the data
    from itertools import combinations
    
    result = []
    for combo in combinations(cols, 3):
        result.append(df.drop_duplicates(list(combo)))
    
    result = pd.concat(result)
    

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2018-08-13
      • 2013-06-13
      相关资源
      最近更新 更多