【问题标题】:Pandas: Drop duplicates based on row valuePandas:根据行值删除重复项
【发布时间】:2019-10-21 16:02:16
【问题描述】:

我有一个数据框,我想根据不同的条件删除重复项......

        A      B
  0     1     1.0
  1     1     1.0
  2     2     2.0
  3     2     2.0
  4     3     3.0
  5     4     4.0
  6     5     5.0
  7     -     5.1
  8     -     5.1
  9     -     5.3

我想删除 A 列中的所有重复项,但带有“-”的行除外。在此之后,我想从列 A 中删除重复项,并根据其列 B 值使用“-”作为值。给定输入数据框,这应该返回以下内容:-

        A      B
  0     1     1.0
  2     2     2.0
  4     3     3.0
  5     4     4.0
  6     5     5.0
  7     -     5.1
  9     -     5.3

我有以下代码,但是对于大量数据来说效率不是很高,我该如何改进......

 def generate(df):
     str_col = df[df["A"] == "-"]

     df.drop(df[df["A"] == "-"].index, inplace=True)

     df = df.drop_duplicates(subset="A")

     str_col = b.drop_duplicates(subset="B")

     bigdata = df.append(str_col, ignore_index=True)

     return bigdata.sort_values("B")

【问题讨论】:

  • 在您给定的示例中,df.drop_duplicates() 会完成相同的操作。
  • 你会怎么做,看看我是 Pandas 的新手

标签: python pandas dataframe


【解决方案1】:

duplicatedeq

df[~df.duplicated('A')            # keep those not duplicates in A
   | (df['A'].eq('-')             # or those '-' in A
      & ~df['B'].duplicated())]   # which are not duplicates in B

输出:

   A    B
0  1  1.0
2  2  2.0
4  3  3.0
5  4  4.0
6  5  5.0
7  -  5.1
9  -  5.3

【讨论】:

    【解决方案2】:

    df.drop_duplicates(subset=['A', 'B'])

    给定一整套数据:

       A    B  C
    0  1  1.0  0
    1  1  1.0  1
    2  2  2.0  2
    3  2  2.0  3
    4  3  3.0  4
    5  4  4.0  5
    6  5  5.0  6
    7  -  5.1  7
    8  -  5.1  8
    9  -  5.3  9
    

    结果:

       A    B  C
    0  1  1.0  0
    2  2  2.0  2
    4  3  3.0  4
    5  4  4.0  5
    6  5  5.0  6
    7  -  5.1  7
    9  -  5.3  9
    

    【讨论】:

    • 如此简单。谢谢
    • 注意:这仅在您的 AB 完全重复时才有效。例如如果第 1 行 B 变为 2.0 则第 0 行和第 1 行仍将显示。
    【解决方案3】:

    groupby + head

    df.groupby(['A','B']).head(1)
    Out[7]: 
       A    B
    0  1  1.0
    2  2  2.0
    4  3  3.0
    5  4  4.0
    6  5  5.0
    7  -  5.1
    9  -  5.3
    

    【讨论】:

    • 虽然简单,但这与我的回答有相同的警告 - 如果 A 重复但 B 是唯一的,则不会删除 A 的重复项。
    猜你喜欢
    • 2021-02-27
    • 2021-01-08
    • 1970-01-01
    • 2021-04-02
    • 2021-12-06
    • 2016-05-05
    • 1970-01-01
    • 2022-10-14
    • 2017-07-07
    相关资源
    最近更新 更多