【问题标题】:Removing duplicates based on value in other column in pandas根据熊猫其他列中的值删除重复项
【发布时间】:2023-01-11 19:10:19
【问题描述】:

我正在尝试删除 duplicates 列中的重复项,并仅保留 name 列中的值等于“foo”的记录。有没有比我的方法更好的方法?

import pandas as pd

df = pd.DataFrame(
    {"name": ["foo", "bar", "foo", "baz"], "duplicates": ["qux", "qux", "fred", "fred"]}
)
df["name"] = df["name"].map({"foo": "a"})
df.sort_values(["name", "duplicates"], inplace=True, ascending=True)
df.drop_duplicates("duplicates")

【问题讨论】:

    标签: pandas


    【解决方案1】:

    如果duplicates不匹配foo,您的解决方案还需要值,对吗?

    然后解决方案是使用 DataFrameGroupBy.idxmax 作为每组的第一个 Trues 与 msk 比较 foo - 如果不存在首先获得 False 值:

    df = pd.DataFrame(
        {"name": ["foo", "bar", "foo", "baz","bez"], 
         "duplicates": ["qux", "qux", "fred", "fred","John"]}
    )
    print (df)
      name duplicates
    0  foo        qux
    1  bar        qux
    2  foo       fred
    3  baz       fred
    4  bez       John
    
    df = df.loc[df["name"].eq('foo').groupby(df['duplicates']).idxmax()]
    
    print (df)
      name duplicates
    4  bez       John
    2  foo       fred
    0  foo        qux
    

    【讨论】:

      【解决方案2】:

      您删除“重复”列中的重复值并仅保留“名称”列等于“foo”的记录的方法是一个很好的方法。但是,有一种更简单、更有效的方法可以使用 query() 方法和 drop_duplicates() 函数实现相同的结果。这是您可以做到的一种方法:

      df = df.query('name == "foo"')
      df = df.drop_duplicates(subset='duplicates')
      

      第一行使用 query() 方法只选择“name”列等于“foo”的行,这样你就不需要将数据框更改为新的,也不需要排序数据框。

      第二行使用 drop_duplicates() 函数,并将 subset 参数设置为“duplicates”,以根据“duplicates”列中的值删除任何重复行,但保留第一次出现的行。

      这种方法更有效,因为它不需要对 DataFrame 进行排序,并消除了不必要的步骤。

      还有一种不使用查询方法即可获得相同结果的替代方法是

      df = df[df["name"] == "foo"].drop_duplicates(subset='duplicates')
      

      当您想要根据特定条件过滤某些行并在一个步骤中删除重复项时,您可以使用这种方法。

      【讨论】:

        【解决方案3】:

        IIUC,你原来的df是

        import pandas as pd
        
        df = pd.DataFrame(
            {"name": ["foo", "bar", "foo", "baz"], "duplicates": ["qux", "qux", "fred", "fred"]}
        )
        

        输出是

        name duplicates
        0 foo qux
        1 bar qux
        2 foo fred
        3 baz fred

        这个怎么样?

        df[
            df['duplicates']
                .isin(df.groupby('duplicates')
                        .size()
                        .reset_index(name='count')
                        .query('count>1')['duplicates']
                    )
            ].query('name=="foo"')
        

        所以你会得到

        name duplicates
        0 foo qux
        2 foo fred

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-09
          • 1970-01-01
          • 2015-11-07
          • 2021-04-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多