基于指定多列去重并保留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
相关产品推荐
相关产品推荐

