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

基于指定多列去重并保留NA最少的最完整数据行实现方法

实现方案

R语言实现(dplyr工具链)

library(dplyr)

# 读入数据后执行以下逻辑
result <- df %>%
  # 计算每行非NA值的总数量
  mutate(non_na_count = rowSums(!is.na(.))) %>%
  # 按去重规则分组
  group_by(ID, Month, Color) %>%
  # 每组内按非NA数量倒序排列,信息最完整的排在最前
  arrange(desc(non_na_count), .by_group = TRUE) %>%
  # 取每组第一条记录
  slice(1) %>%
  ungroup() %>%
  # 删除辅助计算列
  select(-non_na_count)

Python实现(pandas)

import pandas as pd

# 读入数据后执行以下逻辑
# 计算每行非空值的总数量
df['non_na_count'] = df.notna().sum(axis=1)
# 先按分组字段+非空数量倒序排序,再按分组去重保留第一条
result = df.sort_values(by=['ID', 'Month', 'Color', 'non_na_count'], 
                        ascending=[True, True, True, False]) \
           .drop_duplicates(subset=['ID', 'Month', 'Color'], keep='first') \
           .drop(columns='non_na_count')

SQL实现

适用所有支持窗口函数的SQL引擎,语法可根据对应方言微调:

SELECT * EXCEPT(non_na_count, rn)
FROM (
    SELECT 
        *,
        -- 统计当前行非空字段总数
        (CASE WHEN Month IS NOT NULL THEN 1 ELSE 0 END +
         CASE WHEN Day IS NOT NULL THEN 1 ELSE 0 END +
         CASE WHEN Year IS NOT NULL THEN 1 ELSE 0 END +
         CASE WHEN Color IS NOT NULL THEN 1 ELSE 0 END +
         CASE WHEN Weather IS NOT NULL THEN 1 ELSE 0 END +
         CASE WHEN Location IS NOT NULL THEN 1 ELSE 0 END +
         CASE WHEN Transporation IS NOT NULL THEN 1 ELSE 0 END +
         CASE WHEN ID IS NOT NULL THEN 1 ELSE 0 END) AS non_na_count,
        -- 分组内按非空数倒序排名
        ROW_NUMBER() OVER(PARTITION BY ID, Month, Color ORDER BY non_na_count DESC) AS rn
    FROM 你的表名
) t
WHERE rn = 1;

如果出现同组内两条记录非空数量完全一致的情况,可以在排序逻辑中额外补充其他字段的排序规则,避免随机取数。

内容的提问来源于stack exchange,提问作者user35131

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:54:03