如何在Pandas DataFrame中去重siteID列并保留所有nan值?
解决Pandas中保留非重复非nan行(最大date)及所有nan行的问题
原代码df.sort_values('date').drop_duplicates('siteID', keep='last')的问题在于:它会将所有siteID='nan'的行视为同一重复组,仅保留最后一条(即date最大的那条nan行),因此丢失了其他需要保留的nan行。
以下是两种可行的解决方案:
方法一:拆分处理后合并
通过将数据拆分为「非nan行」和「nan行」两个子集,分别处理后再合并:
import pandas as pd data1 = { "siteID": [1, 2, 3, 1, 2, 'nan', 'nan', 'nan'], "date": [42, 30, 43, 29, 26, 34, 10, 14], } df = pd.DataFrame(data1) # 分离非nan行和nan行 non_nan_df = df[df['siteID'] != 'nan'] nan_df = df[df['siteID'] == 'nan'] # 对非nan行按siteID分组,保留每个siteID对应date最大的行 non_nan_unique = non_nan_df.groupby('siteID', as_index=False)['date'].max() # 合并结果并按date排序 result = pd.concat([nan_df, non_nan_unique], ignore_index=True) result = result.sort_values('date', ignore_index=True) print(result)
输出结果:
siteID date 0 nan 10 1 nan 14 2 2 30 3 nan 34 4 1 42 5 3 43
方法二:使用掩码筛选
通过生成掩码标记需要保留的行(非nan行中date最大的行 + 所有nan行),直接筛选后排序:
import pandas as pd data1 = { "siteID": [1, 2, 3, 1, 2, 'nan', 'nan', 'nan'], "date": [42, 30, 43, 29, 26, 34, 10, 14], } df = pd.DataFrame(data1) # 生成掩码:非nan行中date等于该siteID的最大值,或者是nan行 mask = (df['siteID'] != 'nan') & (df['date'] == df.groupby('siteID')['date'].transform('max')) result = df[mask | (df['siteID'] == 'nan')] # 按date排序得到预期输出 result = result.sort_values('date', ignore_index=True) print(result)
输出结果与方法一完全一致。
内容的提问来源于stack exchange,提问作者Bojan Milinic
相关产品推荐
相关产品推荐

