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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:45:37