如何在Julia DataFrame中删除指定前缀列全缺失的行
在Julia DataFrame中删除指定前缀列全缺失的行
问题背景
现有如下Julia DataFrame:
using DataFrames df = DataFrame( group = ["A", "A", "A", "B", "B", "B"], V1 = [1, missing, missing, 3, missing, missing], V2 = [missing, missing, missing, 2, missing, missing], V3 = [missing, missing, 4, missing, 1, missing], Z1 = [3, missing, missing, 3, missing, missing], Z2 = [3, 1, 5, 2, missing, 3], Z3 = [missing, missing, 2, missing, missing, missing])
对应的表格输出:
6×7 DataFrame Row │ group V1 V2 V3 Z1 Z2 Z3 │ String Int64? Int64? Int64? Int64? Int64? Int64? ─────┼────────────────────────────────────────────────────────────── 1 │ A 1 missing missing 3 3 missing 2 │ A missing missing missing missing 1 missing 3 │ A missing missing 4 missing 5 2 4 │ B 3 2 missing 3 2 missing 5 │ B missing missing 1 missing missing missing 6 │ B missing missing missing missing 3 missing
需要删除所有以"V"开头的列全为缺失值的行(即第2行和第6行),期望得到如下结果:
4×7 DataFrame Row │ group V1 V2 V3 Z1 Z2 Z3 │ String Int64? Int64? Int64? Int64? Int64? Int64? ─────┼────────────────────────────────────────────────────────────── 1 │ A 1 missing missing 3 3 missing 2 │ A missing missing 4 missing 5 2 3 │ B 3 2 missing 3 2 missing 4 │ B missing missing 1 missing missing missing
解决方法
步骤1:筛选目标列
先提取所有以"V"开头的列名:
v_cols = filter(col -> startswith(col, "V"), names(df))
执行后v_cols会得到["V1", "V2", "V3"]。
步骤2:过滤行
可以通过两种常用方式实现行过滤:
方法一:使用subset函数
subset是DataFrames包中专门用于筛选行的函数,结合ByRow对每行进行判断:
result_df = subset(df, v_cols .=> ByRow(x -> !all(ismissing, x)), renamecols=false)
这里v_cols .=> ByRow(...)表示对每个V开头的列所在的行,检查是否不是所有值都缺失,renamecols=false用于保留原列名。
方法二:使用行索引过滤
通过eachrow遍历每行,结合map生成布尔索引,再筛选行:
result_df = df[map(row -> !all(ismissing, row[v_cols]), eachrow(df)), :]
该方法通过判断每行中V开头列是否不全为缺失值,生成一个布尔数组,以此作为行索引保留符合条件的行。
两种方法都能得到期望的输出结果。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

