【问题标题】:Pandas drop_duplicates. Keep first AND last. Is it possible?熊猫 drop_duplicates。保持第一和最后。可能吗?
【发布时间】:2020-10-24 13:06:07
【问题描述】:

我有这个数据框,我需要删除所有重复项,但我需要保留第一个和最后一个值

例如:

1      0

2     0

3     0

4     0

输出:

1     0

4     0

我试过df.column.drop_duplicates(keep=("first","last")),但它不说话,它返回

ValueError: keep 必须是“first”、“last”或 False

有没有人知道这有什么好转的?

谢谢

【问题讨论】:

    标签: pandas drop-duplicates


    【解决方案1】:

    您可以使用panda's concat 函数创建一个包含第一个值和最后一个值的数据框。

    pd.concat([
        df['X'].drop_duplicates(keep='first'),
        df['X'].drop_duplicates(keep='last'),
    ])
    

    【讨论】:

      【解决方案2】:

      在名为column 的列上使用 groupby,然后重新索引。如果您想检查多列中的重复值,可以扩展您在 groupby 中包含的列。

      df = pd.DataFrame({'column':[0,0,0,0]})
      

      输入:

         column
      0       0
      1       0
      2       0
      3       0
      

      df.groupby('column', as_index=False).apply(lambda x: x if len(x)==1 else x.iloc[[0, -1]]).reset_index(level=0, drop=True)
      

      输出:

         column
      0       0
      3       0
      

      【讨论】:

        【解决方案3】:

        你不能同时删除第一个和最后一个...所以技巧是连接第一个和最后一个数据帧。

        当您连接时,必须处理创建非重复项的重复项。所以只能在第二个数据帧中连接唯一索引。 (不确定合并/加入是否会更好?)

        import pandas as pd
        
        d = {1:0,2:0,10:1, 3:0,4:0}
        
        df = pd.DataFrame.from_dict(d, orient='index', columns=['cnt'])
        print(df)
        
            cnt
        1     0
        2     0
        10    1
        3     0
        4     0
        

        然后这样做:

        d1 = df.drop_duplicates(keep=("first"))
        d2 = df.drop_duplicates(keep=("last"))
        d3 = pd.concat([d1,d2.loc[set(d2.index) - set(d1.index)]])
        d3
        Out[60]:
        cnt
        1   0
        10  1
        4   0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-11
          • 2022-01-09
          • 2021-02-11
          • 2019-02-22
          • 1970-01-01
          • 2019-01-16
          • 2020-10-19
          相关资源
          最近更新 更多