在此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
答案 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
有关更多信息,请参阅dropna
和drop_duplicates