【问题标题】:Pandas drop duplicates ignoring NaN熊猫丢弃重复忽略 NaN
【发布时间】:2018-12-15 11:58:06
【问题描述】:

在 Pandas df 中,我试图在多个列中删除重复项。每行的大量数据是NaN

这只是一个例子,数据参差不齐,因此存在许多不同的组合。

df.drop_duplicates()

    IDnum       name            formNumber
1   NaN         AP GROUP        028-11964
2   1364615.0   AP GROUP        NaN
3   NaN         AP GROUP        NaN

希望的输出:

    IDnum       name            formNumber
1   1364615.0   AP GROUP        028-11964

编辑:

如果df.drop_duplicates() 看起来像这样,它会改变解决方案吗? :

df.drop_duplicates()

    IDnum       name            formNumber
0   NaN         AP GROUP        028-11964
1   1364615.0   AP GROUP        028-11964
2   1364615.0   AP GROUP        NaN
3   NaN         AP GROUP        NaN

【问题讨论】:

  • 我猜这是 float('nan') != float('nan')(或任何 Pandas 等价物用于非浮点 NaN)的一个症状,因为 NaN 值不等于任何东西,包括它们自己。跨度>

标签: python pandas dataframe duplicates


【解决方案1】:

您可以使用groupby + first

df.groupby('name',as_index=False).first()
Out[206]: 
      name      IDnum formNumber
0  APGROUP  1364615.0  028-11964

【讨论】:

    【解决方案2】:

    你需要:

    df.bfill().ffill().drop_duplicates()
    

    输出:

    IDnum   name    formNumber
    0   1364615.0   AP GROUP    028-11964
    

    【讨论】:

    • 也许我没有正确举例说明 df 是许多不同的“id”,但这种方法乍一看是正确的。但实际上造成了一堆不正确的结果。它似乎不分青红皂白地造成了不匹配。
    • 使用 groupby 进行此操作可能是大多数读者所追求的 - 或者至少,我曾经是。
    【解决方案3】:

    我们可以通过多种方式从数据框中删除重复项。几种常见的方法是:

    #option 1
    df.drop_duplicates()
    
    #option 2
    df.groupby(df.columns.tolist()).size()
    

    这两个选项之间的主要区别是:

    1. 选项 1 考虑 NAN 值。例如你的情况

       df.drop_duplicates()
      
           IDnum       name            formNumber
       0   NaN         AP GROUP        028-11964
       1   1364615.0   AP GROUP        028-11964
       2   1364615.0   AP GROUP        NaN
       3   NaN         AP GROUP        NaN
      

    这里的索引 0,1,2,3 都是唯一的行,尽管以某种形式存在重复。

    1. 选项 2 仅考虑非 NAN 值并过滤重复项,如 @BENY 的第一个答案中所述

    df.groupby('name',as_index=False).first()

          name    IDnum formNumber
    0  APGROUP  1364615.0  028-11964
    

    在上面的例子中,我们只看到一个唯一且不重复的值作为分组依据,没有考虑 NAN。

    为了更好地理解这一点,我们可以这样做:

    df.drop_duplicates().info()
    df.groupby(df.columns.tolist(),as_index=False).first().info()
    

    通过运行上面的代码,我们得到不同的“非空”记录计数。这解释了与第一个选项相比,第二个选项忽略了多少空值。

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 2016-08-27
      • 1970-01-01
      • 2020-05-09
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      相关资源
      最近更新 更多