You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:35:51