【问题标题】:Pandas - Conditional drop duplicates based on number of NaNPandas - 根据 NaN 的数量有条件地删除重复项
【发布时间】:2019-10-20 18:18:48
【问题描述】:

我有一个适用于 Python 3.7x 的 Pandas 0.24.2 数据框,如下所示。我想drop_duplicates() 基于条件逻辑具有相同的名称。可以在这里找到类似的问题:Pandas - Conditional drop duplicates 但在我的情况下它变得更加复杂

import pandas as pd
import numpy as np
df = pd.DataFrame({
          'Id':    [1,      2,      3,      4,      5,      6     ],
          'Name':  ['A',    'B',    'C',    'A',    'B',    'C'   ],
          'Value1':[1,      np.NaN, 0,      np.NaN, 1,      np.NaN],
          'Value2':[np.NaN, 0,      np.NaN, 1,      np.NaN, 0     ],
          'Value3':[np.NaN, 0,      np.NaN, 1,      np.NaN, np.NaN]
})

怎么可能:

  1. 删除相同“名称”记录的重复项,保留 NaN 较少的记录?

  2. 如果它们具有相同数量的 NaN,是否将没有 NaN 的 NaN 保留在“Value1”中?

期望的输出是:

    Id  Name  Value1  Value2  Value3
2   2    B     NaN      0       0
3   3    C     0        NaN     NaN       
4   4    A     NaN      1       1      

【问题讨论】:

    标签: python-3.x pandas duplicates


    【解决方案1】:

    想法是为这两个条件创建辅助列,排序和删除重复项:

    df1 = df.assign(count= df.isna().sum(axis=1),
                    count_val1 = df['Value1'].isna().view('i1'))
    df2 = (df1.sort_values(['count', 'count_val1'])[df.columns]
              .drop_duplicates('Name')
              .sort_index())
    print (df2)
       Id Name  Value1  Value2  Value3
    1   2    B     NaN     0.0     0.0
    2   3    C     0.0     NaN     NaN
    3   4    A     NaN     1.0     1.0
    

    【讨论】:

    • 像一个魅力一样工作,如果有更大的数据集更快的东西会很好。非常感谢!
    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2019-02-02
    • 2020-05-22
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多