在 Pandas 中删除列子集为空的行

Drop rows where a subset of columns are empty in Pandas

我有一个 pandas 数据框,格式如下

No  ei1  ei2  ei3  ei4  ei1_val  ei2_val  ei3_val  ei4_val
123
124
125  0   0    0    1    low      low      high     high

为了简化,我在这里只显示了列的子集,但实际上 pandas 数据框有从 ei1 到 ei24 和 ei1_val 到 ei24_val 的列。

我使用以下代码检索了列名:

val_cols = df[[col for col in df.columns if col.endswith("_val")]]
cols = [col.replace('_val', '') for col in val_cols.columns]

之后,如果 val_cols 中的所有列和 cols 中的所有列都为空,我需要从数据帧 df 中删除行。因此,输出数据帧将删除编号为 123 和 124 的行。不确定是否有一种方法可以在 Pandas 中有效地执行此操作,而不是遍历列并检查值。

如有任何建议,我们将不胜感激。

IIUC,尝试:

m = ~df.filter(regex='.*_val').isna().all(axis=1)
df[m]

输出:

    No  ei1  ei2  ei3  ei4 ei1_val ei2_val ei3_val ei4_val
2  125  0.0  0.0  0.0  1.0     low     low    high    high

pd.DataFrame.filter 方法中使用正则表达式查找列 header 以 _val 结尾的所有列。

使用 isna 检查是否所有值都是 NaN 并且所有值都使用 axis=1