在pandas中去除重复值并保留NaN值

32
当使用drop_duplicates()方法时,我会减少重复项,但也会将所有NaNs合并为一个条目。 如何在保留具有空条目的行(如np.nan,None或'')的情况下删除重复项?
import pandas as pd
df = pd.DataFrame({'col':['one','two',np.nan,np.nan,np.nan,'two','two']})

Out[]: 
   col
0  one
1  two
2  NaN
3  NaN
4  NaN
5  two
6  two


df.drop_duplicates(['col'])

Out[]: 
   col
0  one
1  two
2  NaN
3个回答

38

尝试

df[(~df.duplicated()) | (df['col'].isnull())]

结果是:

col
0   one
1   two
2   NaN
3   NaN     
4   NaN

9
对于一个非常大的数据集,“df=df[df['col'].isnull() | ~df[df['col'].notnull()].duplicated(subset='col',keep='first')]” 的效率更高。 - user2118915
如果索引中存在重复的值,您可能需要先执行df.reset_index(inplace=True) - Pawel Kranzberg

2

好的,一个不太美观的解决方法是先保存NaN,然后再放回去:

temp = df.iloc[pd.isnull(df).any(1).nonzero()[0]]
asd = df.drop_duplicates('col')
pd.merge(temp, asd, how='outer')
Out[81]: 
   col
0  one
1  two
2  NaN
3  NaN
4  NaN

请注意,这仅保存了 NaN 而不是其他版本的“缺失”。您要保存的确切内容取决于数据集。通常,同时具有几个不同的 缺失数据 指标是没有意义的。 - FooBar

0

使用:

df.drop_duplicates('col').append(df[df['col'].isna()])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接