如何保留任一列中都没有Nan的重复行之一?

时间:2019-05-23 05:22:58

标签: python python-3.x pandas numpy

在此dataset中,每个重复行的贷款ID和客户ID均相同。重复行的其他功能也相似,除了某些重复行中的某一行有NaN,而另一行则没有NaN。我想保留没有NaN的重复行,但无法这样做。在这个问题上的任何帮助将不胜感激。

我尝试了这段代码,但是它抛出了MemoryError,我不确定为什么:

data[(~data.duplicated())|(data.notnull())]

我遇到了MemoryError

样本数据:

data = pd.DataFrame({
        'Loan ID':list('aaabbc'),
        'Customer ID':list('hhhttt'),
        'C':[np.nan,8,9,4,2,3],
        'D':[1,np.nan,5,7,1,np.nan]
})

print (data)
  Loan ID Customer ID    C    D
0       a           h  NaN  1.0
1       a           h  8.0  NaN
2       a           h  9.0  5.0
3       b           t  4.0  7.0
4       b           t  2.0  1.0
5       c           t  3.0  NaN

2 个答案:

答案 0 :(得分:0)

您可以使用:

#specify columns for test dupe values and add keep=False for return all dupes, invert by ~
m1 = ~data.duplicated(subset=['Loan ID','Customer ID'], keep=False)
print (m1)
0    False
1    False
2    False
3    False
4    False
5     True
dtype: bool

#check if not missing rows per rows
m2 = data.notnull().all(axis=1)
print (m2)
0    False
1    False
2     True
3     True
4     True
5    False
dtype: bool

#chain conditions by bitwise OR
df = data[m1 | m2]
print (df)
  Loan ID Customer ID    C    D
2       a           h  9.0  5.0
3       b           t  4.0  7.0
4       b           t  2.0  1.0
5       c           t  3.0  NaN

#if need ony one row per duplicated rows by specified columns
df = df.drop_duplicates(['Loan ID','Customer ID'])
print (df)
  Loan ID Customer ID    C    D
2       a           h  9.0  5.0
3       b           t  4.0  7.0
5       c           t  3.0  NaN

答案 1 :(得分:0)

使用它来获取您想要的东西:

print(data.dropna().drop_duplicates(['Loan ID','Customer ID']))

输出为:

  Loan ID Customer ID    C    D
2       a           h  9.0  5.0
3       b           t  4.0  7.0

有关更多信息,请参阅dropnadrop_duplicates