在pandas中去重时保留NaN

34 投票
3 回答
26782 浏览
提问于 2025-04-18 05:38

在使用 drop_duplicates() 这个方法的时候,我可以去掉重复的项,但同时也会把所有的 NaNs 合并成一条记录。我该怎么做才能去掉重复项,同时保留那些有空值的行(比如 np.nanNone 或者 '')呢?

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 个回答

0

使用:

df.drop_duplicates('col').append(df[df['col'].isna()])
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
39

尝试一下

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

结果是:

col
0   one
1   two
2   NaN
3   NaN     
4   NaN

撰写回答