在 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
我有一个 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