熊猫-基于NaN数量的条件下降重复项

时间:2019-10-09 08:18:15

标签: python-3.x pandas duplicates

我有一个适用于Python 3.7x的Pandas 0.24.2数据框,如下所示。我想根据条件逻辑使用相同的名称drop_duplicates()。在这里可以找到类似的问题:https://gist.github.com/mraleph/3397008,但就我而言,情况变得更加复杂

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      

1 个答案:

答案 0 :(得分:2)

想法是为这两个条件创建帮助列,以对重复项进行排序并删除重复项:

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